Jawaban lainnya hanya berspekulasi, jadi saya menulis proyek Unity sederhana dan membiarkannya berjalan untuk sementara waktu. Setelah beberapa jam, inilah hasilnya:
UnityEngine.Time.time
kehilangan akurasi agak cepat. Seperti yang diharapkan, setelah menjalankan game selama 4 jam nilainya melonjak 1 milidetik, dan ketidaktepatan meningkat setelah itu.
UnityEngine.Time.deltaTime
menjaga akurasi awal sub-milidetik bahkan setelah Unity berjalan selama berjam-jam. Dengan demikian, dijamin deltaTime
dari turunan resolusi tinggi yang tergantung platform (yang biasanya meluap setelah 10-1000 tahun). Masih ada risiko kecil yang deltaTime
masih akan kehilangan presisi pada beberapa platform.
Ketidaktepatan Waktu adalah masalah untuk semua yang bergantung pada UnityEngine.Time.time
. Salah satu contoh spesifik adalah rotasi (misalnya kincir angin), yang biasanya didasarkan pada UnityEngine.Mathf.Sin(UnityEngine.Time.time*rotationSpeed)
. Bahkan lebih banyak masalah _Time
yang secara eksplisit digunakan untuk animasi oleh shader. Seberapa tinggi ketidaktelitian yang dibutuhkan sebelum mulai terlihat? Akurasi 20-30 ms (2 hari) harus menjadi titik di mana orang yang menyadari masalah ini, dan memperhatikan, akan melihat. Pada 50-100 ms (5-10 hari) orang-orang sensitif yang tidak tahu tentang masalah akan mulai mencari tahu. Dari 200-300 ms (20-30 hari) masalahnya akan jelas.
Sejauh ini saya belum diuji akurasi _SinTime
, _CosTime
dan Unity_DeltaTime
, jadi saya tidak bisa mengomentari ini.
Ini adalah Skrip yang saya gunakan untuk pengujian. Itu dilampirkan ke UI.Text
elemen, Pengaturan Pemain dari proyek memungkinkan proyek untuk menjalankan sementara di latar belakang, dan VSync dalam Pengaturan Kualitas diatur ke Setiap Detik V Kosong:
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;
}
}
Jika Anda bertanya-tanya tentang 0.033203
nilai, saya cukup yakin itu sebenarnya 0.033203125
, yang memiliki representasi titik mengambang biner 00111101000010000000000000000000
. Perhatikan banyak 0
di mantissa.
Penanganan masalah
Sebagian besar genre tidak membutuhkan solusi. Sebagian besar pemain bahkan tidak akan memainkan permainan untuk total 100 jam, jadi menginvestasikan uang untuk memperbaiki masalah yang orang hanya akan perhatikan setelah beberapa hari bermain secara terus-menerus secara hipotesis tidak layak secara ekonomi. Sayangnya saya tidak dapat menemukan solusi universal sederhana yang memperbaiki keseluruhan masalah tanpa membawa beberapa kelemahan yang signifikan.