한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Sách trắng lag game › L1 Tiến trình game phía client

Tải đồng bộ trên main thread và biên dịch shader Synchronous asset load, shader compile

ID nguyên nhân cg-sync-load · Phụ trách chính Phát triển client (Đội phát triển game)

Mở thẻ gốc có hình minh họa và thí nghiệm →

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.

Vì sao Vào khu vực mới, skill, trang bị hoặc quái lần đầu xuất hiện → Dẫn đến Main thread phải chờ đọc file và biên dịch shader → Trên màn hình Chỉ đứng hình 0,1–1 giây ở lần đầu, từ lần thứ hai trở đi thì bình thường

Triệu chứng
Đứng hình, Giật khựng
Yếu tố
Ngưng trệ
Ai gặp phải
Chỉ mình tôi
Khi nào
Khi di chuyển hoặc chuyển bản đồ, Khi làm một thao tác nhất định
Phụ trách
Phụ trách chính Phát triển client (Đội phát triển game)
Việc cần làm (Đội phát triển game)
Tải bất đồng bộ, tải sẵn trước (prewarm), biên dịch shader trước ở màn hình loading hoặc lần chạy đầu tiên, tận dụng màn hình loading.
Con số tham khảo
Biên dịch một shader mất vài chục ms, lâu thì trên 100 ms. Tải texture mất vài chục đến vài trăm ms tùy tốc độ ổ lưu trữ.
Trên đồ thị
Tăng vọt ngay sau đăng nhập hoặc bảo trì · Số lần khung hình vọt lên (ngay sau bản cập nhật hoặc cập nhật driver)
Chỗ cần xem
Dùng PresentMon ghi lại cùng một lộ trình hai lần, so sánh lần đầu với lần thứ hai. Trên bản build development: với Unreal, bật r.PSOPrecache.Validation rồi xem stat PSOPrecache và dòng “PSO PRECACHING MISS” trong log; với Unity, xem đoạn loading và shader của khung hình vọt lên trong Timeline của Profiler
Đúng nếu
chỉ vọt lên 0,1–1 giây ở chỗ lần đầu tới hoặc skill lần đầu dùng, lần thứ hai thì hết. Báo cáo dồn dập ngay sau bản cập nhật hoặc cập nhật driver đồ họa rồi giảm dần
Loại trừ nếu
lần nào tới cùng một chỗ cũng vọt lên thì không phải lỗi shader cache. Chỉ lặp lại mỗi lần di chuyển trên PC có ổ lưu trữ chậm → “Ổ lưu trữ chậm khiến streaming asset không theo kịp”; bộ nhớ GPU chuyên dụng đầy → “Thiếu bộ nhớ đồ họa (VRAM)”
Cách kiểm tra
Cần log và chỉ số của server, client game
Tìm hiểu thêm
Trên PC, shader đã tạo một lần sẽ được driver đồ họa lưu vào shader cache để dùng lại. Vì vậy, ngay sau khi cập nhật driver đồ họa hoặc game ra bản cập nhật, cache này bị vô hiệu, và cả những người trước đó chơi mượt cũng bị giật lại một thời gian. Báo cáo điển hình là “sau bản cập nhật, cứ tới chỗ nào lần đầu là khựng”.

Nguồn

  1. Shader loading Unity
    Lần đầu dùng một shader variant, driver đồ họa phải tạo bản dành cho GPU nên có thể dừng thấy rõ; bản đã tạo được cache nên không dừng lại nữa
  2. Optimizing Rendering With PSO Caches in Unreal Engine Epic Games
    Tạo pipeline state (PSO) vào đúng lúc cần có thể mất trên 100 ms, nên phải tạo sẵn trước
  3. Direct3D 12 Return Codes Microsoft
    D3D12_ERROR_DRIVER_VERSION_MISMATCH: không dùng lại được PSO cache tạo bằng phiên bản driver khác (phải biên dịch lại sau khi cập nhật driver)
  4. PresentMon Capture Application (README-CaptureApplication.md) Intel
    Ghi lại thời gian từng khung hình bằng FrameTime (thời gian CPU giữa hai khung hình)
  5. PSO Precaching for Unreal Engine Epic Games
    Bật r.PSOPrecache.Validation thì xem được thống kê PSO bị bỏ sót bằng stat PSOPrecache và log ghi “PSO PRECACHING MISS”; tạo PSO lúc runtime vượt ngưỡng mặc định 20 ms thì bị tính là hitch

Nguyên nhân nên xem cùng

Cùng tầng: L1 Tiến trình game phía client

Nguyên nhân ở tầng khác gây cùng triệu chứng (Đứng hình)

Xem thẻ gốc có hình minh họa và thí nghiệm