한국어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

Mất độ chính xác thời gian kiểu float Float time precision loss on long sessions

ID nguyên nhân cg-float-time · 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 →

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.

Vì sao Cộng dồn thời gian kể từ lúc bật game vào biến float, hoặc truyền thẳng giá trị đó cho shader → Dẫn đến Bật càng lâu thì khoảng chênh nhỏ nhất mà float biểu diễn được càng lớn → Trên màn hình Chỉ client bật liên tục mấy ngày mới bị rung nhân vật, hoạt ảnh và hiệu ứng chuyển động; khởi động lại là hết

Triệu chứng
Giật khựng
Yếu tố
Jitter
Ai gặp phải
Chỉ mình tôi
Khi nào
Càng chạy lâu càng nặng
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)
Lưu thời gian trôi qua bằng double (64 bit) hoặc số nguyên, định kỳ quay vòng giá trị thời gian truyền cho shader, chạy test tự động kéo dài nhiều ngày.
Con số tham khảo
Float 32 bit chỉ có hơn 7 chữ số có nghĩa, nên sau một ngày bật máy (khoảng 86.400 giây), độ phân giải thời gian đã thô tới khoảng 8 ms, cỡ nửa khung hình ở 60 FPS (16,7 ms); sau một tuần là khoảng 60 ms, lớn hơn cả một khung hình.
Trên đồ thị
Tăng dần · Báo cáo rung theo thời gian client đã bật
Chỗ cần xem
Khi nhận báo cáo rung thì hỏi kèm client đã bật bao lâu, so sánh trước và sau khi khởi động lại. Phía phát triển: test bằng cách đặt giá trị thời gian game như thể đã chạy vài ngày
Đúng nếu
chỉ rung ở client đã bật mấy ngày, khởi động lại là hết, bật càng lâu càng nặng
Loại trừ nếu
vừa bật đã rung → “Bộ đệm nội suy không có hoặc quá ngắn” hoặc “Độ phân giải timer”
Cách kiểm tra
Kiểm tra ở môi trường phía người chơi
Tìm hiểu thêm
Lỗi này hay gặp nhất ở game MMO di động, nơi người chơi bật auto rồi treo máy nhiều ngày liền. Time.time của Unity cũng là float, nên Unity có thêm Time.timeAsDouble kiểu double và khuyên dùng giá trị này.

Nguồn

  1. Time.timeAsDouble Unity
    Phiên bản double của Time.time; chạy càng lâu càng chính xác hơn float, nên hầu hết trường hợp đều khuyên dùng
  2. Floating-point numeric types (C# reference) Microsoft
    Độ chính xác của float khoảng 6–9 chữ số, double khoảng 15–17 chữ số

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 (Giật khựng)

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