Các câu trả lời khác chỉ suy đoán, vì vậy tôi đã viết một dự án Unity đơn giản và để nó chạy một lúc. Sau một vài giờ, đây là kết quả:
UnityEngine.Time.time
mất độ chính xác khá nhanh. Như mong đợi, sau khi chạy trò chơi trong 4 giờ, các giá trị tăng thêm 1 mili giây và độ chính xác sẽ tăng lên sau đó.
UnityEngine.Time.deltaTime
giữ độ chính xác dưới một phần nghìn giây ban đầu ngay cả sau khi Unity đã chạy hàng giờ. Do đó, nó hầu như được đảm bảo có deltaTime
nguồn gốc từ bộ đếm độ phân giải cao phụ thuộc vào nền tảng (thường tràn sau 10-1000 năm). Vẫn còn một rủi ro nhỏ deltaTime
vẫn sẽ mất độ chính xác trên một số nền tảng.
Sự không chính xác của Thời gian là một vấn đề cho mọi thứ phụ thuộc vào UnityEngine.Time.time
. Một ví dụ cụ thể là xoay (ví dụ của cối xay gió), thường dựa trên UnityEngine.Mathf.Sin(UnityEngine.Time.time*rotationSpeed)
. Thậm chí nhiều vấn đề được _Time
sử dụng rõ ràng cho hoạt hình của các shader. Sự thiếu chính xác cần phải cao đến mức nào trước khi nó bắt đầu trở nên đáng chú ý? Độ chính xác 20-30 ms (2 ngày) sẽ là điểm mà những người nhận thức được vấn đề và chú ý kỹ, sẽ chú ý. Ở mức 50-100 ms (5-10 ngày) những người nhạy cảm không biết về vấn đề này sẽ bắt đầu tìm ra vấn đề. Từ 200-300 ms (20-30 ngày), vấn đề sẽ rõ ràng.
Cho đến nay tôi đã không kiểm tra tính chính xác của _SinTime
, _CosTime
và Unity_DeltaTime
, vì vậy tôi không thể bình luận về những.
Đây là Script tôi đã sử dụng để thử nghiệm. Được đính kèm với một UI.Text
yếu tố, Cài đặt trình phát của dự án cho phép dự án chạy trong khi ở chế độ nền và VSync trong Cài đặt chất lượng được đặt thành Mỗi giây V trống:
public class Time : UnityEngine.MonoBehaviour {
void Start () {
LastTime = (double)UnityEngine.Time.time;
StartTime = System.DateTime.Now;
LastPrintTime = System.DateTime.Now;
}
double LastTime;
System.DateTime StartTime;
System.DateTime LastPrintTime;
void Update () {
double deltaTimeError = (double)UnityEngine.Time.deltaTime - ((double)UnityEngine.Time.time - LastTime);
if (System.DateTime.Now - LastPrintTime > System.TimeSpan.FromMilliseconds(1000))
{
GetComponent<UnityEngine.UI.Text>().text = "StartTime: " + StartTime.ToLongTimeString()
+ "\nCurrentTime: " + System.DateTime.Now.ToLongTimeString()
+ "\n\nTime.deltaTime: " + UnityEngine.Time.deltaTime.ToString("0.000000")
+ "\nTime.time - LastTime: " + ((float)(UnityEngine.Time.time - LastTime)).ToString("0.000000")
+ "\nAbsolute Error: " + System.Math.Abs(deltaTimeError).ToString("0.000E0");
LastPrintTime = System.DateTime.Now;
}
LastTime = UnityEngine.Time.time;
}
}
Nếu bạn đang tự hỏi về 0.033203
giá trị, tôi khá chắc chắn rằng đó thực sự 0.033203125
là một đại diện dấu phẩy động nhị phân 00111101000010000000000000000000
. Chú ý nhiều 0
s trong lớp phủ.
Cách giải quyết
Hầu hết các thể loại không cần một cách giải quyết. Hầu hết người chơi thậm chí sẽ không chơi một trò chơi trong tổng số 100 giờ, vì vậy, đầu tư tiền để khắc phục sự cố mọi người sẽ chỉ nhận thấy sau một vài ngày giả định về thời gian chơi liên tục là không khả thi về mặt kinh tế. Thật không may, tôi không thể đưa ra một cách giải quyết phổ quát đơn giản giúp khắc phục toàn bộ vấn đề mà không mang theo một số nhược điểm đáng kể.