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
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
Time.timeAsDoubleUnity 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