Sách trắng lag game › Tra theo triệu chứng
Giật khựng: 60 nguyên nhân và đội phụ trách
Tên gọi khác: giật, giật lag, khựng, cảm giác như tụt FPS
Mở từ điển triệu chứng gốc có hình minh họa →
Chuyển động không mượt, cứ khựng lại một chút rồi chạy tiếp, lặp đi lặp lại.
Nhân vật khác hoặc cả màn hình của bạn “khựng, khựng”. Các điểm quỹ đạo lúc dồn lại, lúc giãn ra.
Nếu ping vẫn ổn thì nhiều khả năng do khung hình trên PC của bạn (client, OS); nếu ping lúc cao lúc thấp thì nhiều khả năng là jitter của Wi-Fi hoặc đường truyền. Tuy vậy, chỉ số ping trong game thường được đo bên trong vòng lặp game chạy theo từng khung hình, nên khi frame time vọt lên thì con số ping cũng có thể nhảy theo.
Nguyên nhân gây ra triệu chứng này
L1 Tiến trình game phía client
- Frame time vọt lên: Việc tính toán một khung hình mất thời gian gấp nhiều lần bình thường nên màn hình dừng lại trong chốc lát. (Phát triển client (Đội phát triển game))
- Thu gom rác (GC) phía client: Trong lúc thu hồi bộ nhớ đã dùng xong (rác), cả game dừng lại. Đặc trưng là giật khựng theo khoảng cách đều đặn. (Phát triển client (Đội phát triển game))
- Tải đồng bộ trên main thread và biên dịch shader: Ngay trước khi vẽ khu vực, quái hay hiệu ứng lần đầu xuất hiện, game phải đọc file và tạo shader nên bị dừng. (Phát triển client (Đội phát triển game))
- Ổ lưu trữ chậm khiến streaming asset không theo kịp: Trên ổ lưu trữ chậm như HDD, tốc độ đọc texture và model của thế giới mở không theo kịp tốc độ di chuyển, nên đối tượng hiện ra muộn hoặc game giật vì phải chờ đọc xong. (Phát triển client (Đội phát triển game))
- Tải render khi đông người: Khi hàng trăm người cùng hiện trên một màn hình như lúc công thành hay đánh world boss, riêng chi phí vẽ đã vượt quá sức máy. (Phát triển client (Đội phát triển game))
- Bộ đệm nội suy không có hoặc quá ngắn: Nếu vẽ ngay khi nhận gói tin từ server, jitter (độ dao động của khoảng cách giữa các lần gói tin đến) lộ nguyên trên màn hình. (Phát triển client (Đội phát triển game))
- Ngoại suy quá mức (dead reckoning): Trong lúc không có gói tin, client cho đối tượng tiếp tục di chuyển theo vận tốc cuối cùng, rồi khi biết là sai thì kéo lại. (Phát triển client (Đội phát triển game))
- Fixed timestep chạy bù mất kiểm soát: Sau một lần dừng, game dồn phần tính toán bị tồn lại để chạy bù, và chính phần tính toán đó lại làm game chậm tiếp. (Phát triển client (Đội phát triển game))
- Sai lệch đồng bộ đồng hồ: Nếu giờ server mà client ước tính bị sai, thời điểm nội suy và việc phán định hồi chiêu sẽ lệch. (Phát triển client (Đội phát triển game))
- Mất độ chính xác thời gian kiểu float: Nếu game lưu thời gian bằng kiểu số thực độ chính xác thấp (float), game bật càng lâu thì độ phân giải thời gian (khoảng chênh nhỏ nhất còn phân biệt được) càng kém, khiến chuyển động và hiệu ứng bị rung. (Phát triển client (Đội phát triển game))
- V-Sync và hàng đợi render: GPU xếp vài khung hình đã vẽ vào hàng đợi rồi mới đẩy ra theo chu kỳ của màn hình, và trong lúc đó thao tác bị trễ. (Phát triển client (Đội phát triển game))
- Rò rỉ bộ nhớ phía client: Game bật càng lâu thì bộ nhớ dùng càng tăng, game chậm dần rồi cuối cùng bị tắt cưỡng bức. (Phát triển client (Đội phát triển game))
- Kiểm tra của module bảo mật game (anti-cheat): Module bảo mật chạy cùng game để chống hack sẽ kiểm tra định kỳ. Nếu lần kiểm tra nặng, hoặc heartbeat (tín hiệu định kỳ báo vẫn còn sống) trao đổi với server bảo mật bị trễ, game sẽ giật khựng hoặc mất kết nối. (Phát triển client (Đội phát triển game))
L2 OS và thiết bị phía client
- Tiến trình chạy nền chiếm giữ CPU: Khi việc quét virus, Windows Update, phần mềm livestream hay video trên trình duyệt chiếm các core, game thread không được cấp CPU và phải chờ. (Bên ngoài (Bên ngoài))
- Chế độ tiết kiệm điện và bóp xung do nhiệt: Chế độ pin của laptop, chế độ tiết kiệm pin của điện thoại hay máy nóng lên đều làm tốc độ CPU, GPU giảm. Đặc trưng của quá nhiệt là lúc đầu vẫn ổn, chơi một lúc lâu mới bắt đầu chậm. (Bên ngoài (Bên ngoài))
- Độ phân giải timer: Timer mặc định của Windows có bước 15,6 ms, nên lệnh “chỉ nghỉ 1 ms” thực tế kéo dài tới chu kỳ timer kế tiếp, lâu nhất tới 15,6 ms. (Phát triển client (Đội phát triển game))
- Phần mềm bảo mật kiểm tra gói tin: Khi phần mềm diệt virus hay tường lửa kiểm tra mọi gói tin, độ trễ tăng lên; nếu quá tay, chúng còn nhầm game là tấn công và chặn lại. (Bên ngoài (Bên ngoài))
- Thiếu bộ nhớ và swap phía client: Khi mở vài chục tab trình duyệt cùng lúc với game, OS đẩy một phần bộ nhớ của game xuống ổ đĩa. (Bên ngoài (Bên ngoài))
- Thiếu bộ nhớ đồ họa (VRAM): Nếu tùy chọn đồ họa cần nhiều bộ nhớ hơn bộ nhớ của card đồ họa, OS phải đẩy texture ra bộ nhớ của PC rồi lấy lại, gây giật khựng. (Phát triển client (Đội phát triển game))
- Wi-Fi quét nền: OS định kỳ chuyển qua các kênh để dò Wi-Fi xung quanh, và trong lúc đó việc truyền dữ liệu tạm dừng. (Bên ngoài (Bên ngoài))
- Tiết kiệm điện NIC và lỗi driver: Nếu card mạng LAN hoặc chip Wi-Fi vào trạng thái tiết kiệm điện giữa các gói tin, việc kích hoạt lại sẽ tốn thời gian. (Bên ngoài (Bên ngoài))
- Giới hạn xử lý khi cửa sổ bị thu nhỏ hoặc mất focus: Khi bạn chuyển sang cửa sổ khác hoặc thu nhỏ game, cả game lẫn Windows đều cho game chạy chậm lại để tiết kiệm điện. Lúc quay lại, gói tin tồn đọng dồn tới một lượt, hoặc kết nối đã bị ngắt. (Phát triển client (Đội phát triển game))
- Phần mềm overlay can thiệp vào game: Phần mềm nhắn tin, launcher, quay màn hình, hiển thị FPS chen vào quá trình render của game (hooking) để vẽ UI của chúng đè lên màn hình game. Mỗi khung hình phải làm thêm việc, và đôi khi xung đột với game gây khựng hoặc làm game bị tắt đột ngột. (Bên ngoài (Bên ngoài))
L3 Mạng gia đình
- Nhiễu và sóng Wi-Fi yếu: Khi sóng yếu hoặc bị nhiễu, đoạn không dây phải gửi lại nhiều lần nên thời điểm gói tin đến lúc nhanh lúc chậm. (Bên ngoài (Bên ngoài))
- Kênh Wi-Fi bị nghẽn: Ở nơi có hàng chục router như chung cư, các thiết bị phải chia nhau cùng một kênh nên phải chờ tới lượt truyền. (Bên ngoài (Bên ngoài))
- Router yếu hoặc quá nhiệt: Khi một router giá rẻ phải gánh hàng chục thiết bị và hàng nghìn kết nối, bản thân router không xử lý nổi. (Bên ngoài (Bên ngoài))
- Sóng di động yếu hoặc vùng lõm sóng: Trong thang máy, tầng hầm hay sâu bên trong tòa nhà, số lần truyền lại tăng, tốc độ giảm và cuối cùng mất kết nối. (Bên ngoài (Bên ngoài))
- Chuyển qua lại 5G↔LTE liên tục (vùng rìa phủ sóng 5G): Ở trong tòa nhà có sóng 5G yếu hoặc vùng rìa phủ sóng 5G, điện thoại liên tục chuyển qua lại giữa 5G và LTE, và mỗi lần chuyển ping lại vọt lên hoặc kết nối bị ngắt chốc lát. (Bên ngoài (Bên ngoài))
L4 Đường truyền Internet
- Internet vệ tinh (quỹ đạo thấp, địa tĩnh): Với Internet vệ tinh, sóng phải đi lên vũ trụ rồi quay về. Vệ tinh địa tĩnh chỉ riêng thời gian khứ hồi đã hơn 0,5 giây. Vệ tinh quỹ đạo thấp như Starlink bình thường thì nhanh, nhưng vào lúc tuyến đường được phân lại, độ trễ dao động và đôi khi kết nối đứt quãng trong chốc lát. (Bên ngoài (Bên ngoài))
- Nghẽn peering vào giờ cao điểm: Khoảng 9–11 giờ tối, lưu lượng video tăng vọt nên đoạn kết nối giữa các nhà mạng (peering) dễ bị nghẽn. (Hạ tầng mạng (Đội hạ tầng))
- Một đường ECMP bị lỗi: Nhà mạng và trung tâm dữ liệu thường có nhiều đường cùng đi tới một đích, và mỗi kết nối được gán cố định vào một đường. Nếu chỉ một đường bị hỏng, chỉ những người được gán vào đường đó liên tục bị lag. (Hạ tầng mạng (Đội hạ tầng))
L6 Card mạng server
- Overhead ảo hóa và noisy neighbor: Nếu máy ảo khác trên cùng server vật lý dùng nhiều mạng và CPU, việc xử lý trên server của bạn bị chậm lại một cách thất thường. (Hạ tầng server (Đội hạ tầng))
L7 OS server (kernel)
- Quá nhiều thread và context switch: Chạy số thread nhiều hơn số core rất nhiều thì OS tốn CPU chỉ để cho chúng chạy luân phiên. (Phát triển server (Đội phát triển game))
- CPU steal (máy ảo): Trong lúc server vật lý (hypervisor) tạm chuyển thời gian CPU của một máy ảo cho máy ảo khác (CPU steal), server game bị dừng. (Hạ tầng server (Đội hạ tầng))
- CPU throttling trong container (CFS quota): Khi container bị đặt giới hạn CPU, ngay lúc dùng hết quota trong một chu kỳ cố định (thường là 100 ms), container bị buộc dừng trong phần thời gian còn lại của chu kỳ đó (throttling). (Hạ tầng server (Đội hạ tầng))
- Dừng do thu hồi bộ nhớ và compaction: Tiến trình bị dừng trong lúc OS dồn bộ nhớ (compaction) để tạo huge page, hoặc thu hồi bộ nhớ để có thêm chỗ trống. (Hạ tầng server (Đội hạ tầng))
- Tác vụ theo lịch: Các tác vụ nén log, sao lưu và quét bảo mật chạy vào cùng một giờ mỗi ngày chiếm CPU và ổ đĩa. (Hạ tầng server (Đội hạ tầng))
- Hiệu năng thay đổi sau khi cập nhật OS, kernel, driver hoặc firmware: Code game không đổi, nhưng server chậm đi kể từ khi cập nhật OS, kernel, driver hoặc firmware. Bản cập nhật có thể làm thay đổi giá trị mặc định, bộ lập lịch, các biện pháp giảm thiểu lỗ hổng CPU (mitigations) và cách driver hoạt động. (Hạ tầng server (Đội hạ tầng))
L9 Tiến trình game phía server
- Vượt tick budget: Khi khối lượng việc trong một tick vượt budget, chu kỳ tick của server bị kéo dài, và cả khu vực đó chạy chậm lại hoặc giật khựng. (Phát triển server (Đội phát triển game))
- Tính toán tầm nhìn (AOI) bùng nổ (N²): Nếu so sánh mọi người với nhau để xem ai thấy được ai, số người tăng 10 lần thì khối lượng tính toán tăng 100 lần. (Phát triển server (Đội phát triển game))
- Gọi đồng bộ (blocking) trên game thread: Nếu giữa tick mà phải chờ phản hồi DB hoặc ghi file, mọi diễn biến game trên server dừng lại đúng khoảng thời gian đó. (Phát triển server (Đội phát triển game))
- Timer kích hoạt dồn cùng lúc: Khi mọi lượt respawn quái, mọi buff hết hạn và phần thưởng lúc tròn giờ dồn vào cùng một tick, riêng tick đó nặng lên gấp hàng chục lần. (Phát triển server (Đội phát triển game))
- Đối tượng tích tụ (vật phẩm và vật triệu hồi không được dọn): Vật phẩm rơi trên đất, vật triệu hồi, timer đã xong lẽ ra phải biến mất. Nếu chúng không được dọn mà cứ tích tụ, server chạy càng lâu thì mỗi tick càng nhiều việc. (Phát triển server (Đội phát triển game))
L10 Bộ nhớ
- GC pause của script engine: Ngay cả server viết bằng C++, nếu nhiệm vụ, AI và skill chạy bằng script như Lua thì trong lúc GC của script engine chạy, zone đó sẽ bị dừng. (Phát triển server (Đội phát triển game))
- Cấp phát bộ nhớ dồn dập: Khi sự kiện tạo ra hàng loạt đối tượng tạm, GC phải chạy thường xuyên hơn nhiều so với bình thường. (Phát triển server (Đội phát triển game))
L11 Ổ đĩa
- Ghi log đồng bộ: Nếu thread game chờ ổ đĩa ghi xong từng dòng log, thì lúc ổ đĩa bận, game cũng bị dừng theo. (Phát triển server (Đội phát triển game))
- fsync dồn dập: Mỗi yêu cầu ghi dữ liệu xuống ổ đĩa “chắc chắn” mất từ 0,1 ms đến vài chục ms tùy ổ đĩa, và khi các yêu cầu dồn lại thì hàng đợi dài ra. (Phát triển server (Đội phát triển game))
- Cạn burst credit của ổ đĩa cloud: Một số ổ đĩa cloud và cấu hình server nhỏ có burst credit cho phép tạm chạy nhanh hơn mức cơ bản. Khi giờ bận kéo dài làm credit cạn, tốc độ đột ngột tụt xuống. (Hạ tầng server (Đội hạ tầng))
- Tác vụ sao lưu, nén, quét: Khi sao lưu lúc rạng sáng, nén log hoặc quét bảo mật chiếm trọn ổ đĩa, việc đọc ghi của server game bị dồn lại. (Hạ tầng server (Đội hạ tầng))
L12 Cơ sở dữ liệu
- Checkpoint, flush log: Đúng lúc DB định kỳ ghi dồn các thay đổi trong bộ nhớ xuống ổ đĩa, query chậm đi. (Hạ tầng DB (Đội hạ tầng))
L13 Kiến trúc và vận hành server
- Quá tải log và giám sát: Khi có sự cố, log tăng đột biến, và server gửi log theo kiểu đồng bộ lại càng chậm hơn vì chính log. (Phát triển server (Đội phát triển game))
Thiết kế đồng bộ
- Lockstep phải chờ người chơi chậm nhất: Trong cấu trúc mọi người cùng tính chung một lượt, chỉ cần input của một người đến muộn là tất cả phải chờ. (Phát triển server (Đội phát triển game))
- Phát ngay khi nhận, không có timestamp: Nếu sự kiện từ server không kèm thời điểm xảy ra mà được phát ngay khi nhận, thời điểm hiển thị sẽ lệch lung tung đúng theo jitter của mạng. (Phát triển client (Đội phát triển game))
- Cấu trúc host (chủ phòng): Nếu PC của một người chơi đóng vai server, đường truyền và hiệu năng PC của người đó quyết định cảm nhận của tất cả mọi người. (Phát triển server (Đội phát triển game))
- Tần suất gửi snapshot thấp: Nếu server chỉ gửi bản cập nhật vị trí (snapshot) vài lần trong 1 giây, bộ đệm nội suy phải đặt dài tương ứng, nên bạn thấy các nhân vật khác ở quá khứ xa hơn. (Phát triển server (Đội phát triển game))
Sự cố chỉ một số người gặp
- Kích thước bộ đệm input theo người chơi: Nếu server gom input của mỗi người một chút rồi lấy ra một input mỗi tick, người khác thấy mượt, nhưng thời điểm hành động của chính người đó được xác nhận trên server sẽ muộn đi tương ứng. (Phát triển server (Đội phát triển game))
- Quyền điều khiển quái nằm ở client chậm: Có những game giao việc tính di chuyển của quái cho client của một người chơi ở gần để giảm tải server. Nếu đường truyền của người đó kém, con quái đó di chuyển kỳ lạ trên màn hình của mọi người. (Phát triển server (Đội phát triển game))
- Streaming thất bại do thiếu bộ nhớ hoặc VRAM: Khi hai client dùng chung bộ nhớ đồ họa, không còn chỗ để nạp model, texture mới cần dùng nên một phần không được vẽ. (Phát triển client (Đội phát triển game))
- Đối tượng bị giữ lại do ước tính đồng hồ sai: Nếu giờ server mà client ước tính bị sai, client sẽ giữ lại thông tin đối tượng vừa tới vì cho là “vẫn còn ở tương lai”, hoặc bỏ đi vì cho là “quá cũ”. (Phát triển client (Đội phát triển game))
Nguyên nhân gốc của truyền lại TCP
- Truyền lại nhanh không cần thiết do gói đến sai thứ tự: Khi đi qua nhiều tuyến hoặc các link được gộp, thứ tự gói tin có thể bị đảo; bên nhận dùng ACK trùng (duplicate ACK) để báo “có gói bị thiếu”, và bên gửi gửi lại cả gói vẫn còn nguyên vẹn. (Hạ tầng mạng (Đội hạ tầng))
Xem từ điển triệu chứng gốc có hình minh họa