คำตอบอื่น ๆ คาดเดาเท่านั้นดังนั้นฉันจึงเขียนโปรเจค Unity ที่เรียบง่ายและปล่อยให้มันทำงานชั่วขณะหนึ่ง หลังจากสองสามชั่วโมงนี่คือผลลัพธ์:
UnityEngine.Time.time
สูญเสียความแม่นยำค่อนข้างเร็ว ตามที่คาดไว้หลังจากใช้งานเกมเป็นเวลา 4 ชั่วโมงค่าจะเพิ่มขึ้น 1 มิลลิวินาทีและความไม่ถูกต้องจะเพิ่มขึ้นหลังจากนั้น
UnityEngine.Time.deltaTime
รักษาความแม่นยำของมิลลิวินาทีย่อยเริ่มต้นแม้ว่า Unity จะทำงานเป็นเวลาหลายชั่วโมง ดังนั้นจึงรับประกันได้ว่า deltaTime
มาจากตัวนับความละเอียดสูงขึ้นอยู่กับแพลตฟอร์ม (ซึ่งมักจะล้นหลังจาก 10-1000 ปี) ยังมีความเสี่ยงเล็กน้อยที่deltaTime
จะยังคงสูญเสียความแม่นยำในบางแพลตฟอร์ม
UnityEngine.Time.time
เที่ยงตรงของเวลาเป็นปัญหาสำหรับทุกอย่างที่ขึ้นอยู่กับ ตัวอย่างหนึ่งที่เฉพาะเจาะจงคือการหมุน (เช่นของกังหันลม) UnityEngine.Mathf.Sin(UnityEngine.Time.time*rotationSpeed)
ซึ่งเป็นไปตามปกติ ปัญหามากขึ้นคือ_Time
สิ่งที่ใช้อย่างชัดเจนสำหรับภาพเคลื่อนไหวโดย shaders ความไม่ถูกต้องจะต้องสูงขนาดไหนก่อนที่จะเริ่มสังเกตเห็น? ความถูกต้อง 20-30 ms (2 วัน) ควรเป็นจุดที่ผู้ที่ตระหนักถึงปัญหาและใส่ใจอย่างใกล้ชิดจะสังเกตเห็น ที่คนละเอียดอ่อนที่ 50-100 มิลลิวินาที (5-10 วัน) ที่ไม่รู้เกี่ยวกับปัญหาจะเริ่มคิดออก จาก 200-300 ms (20-30 วัน) ปัญหาจะชัดเจน
จนถึงขณะนี้ผมยังไม่ได้ทดสอบความถูกต้องของ_SinTime
, _CosTime
และUnity_DeltaTime
ดังนั้นผมจึงไม่สามารถแสดงความคิดเห็นเหล่านี้
นี่คือสคริปต์ที่ฉันใช้ในการทดสอบ มันแนบมากับUI.Text
องค์ประกอบการตั้งค่าผู้เล่นของโครงการอนุญาตให้โครงการทำงานในขณะที่อยู่ด้านหลังและ VSync ในการตั้งค่าคุณภาพถูกตั้งค่าเป็น V ว่างทุกวินาที
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;
}
}
หากคุณสงสัยเกี่ยวกับ0.033203
ความคุ้มค่าผมค่อนข้างแน่ใจว่าเป็นจริงซึ่งมีไบนารีลอยตัวแทนจุด0.033203125
00111101000010000000000000000000
สังเกตหลาย0
s ใน mantissa
วิธีการแก้ปัญหา
ประเภทส่วนใหญ่ไม่จำเป็นต้องมีวิธีแก้ไข ผู้เล่นส่วนใหญ่จะไม่ได้เล่นเกมเป็นเวลา 100 ชั่วโมงดังนั้นการลงทุนเพื่อแก้ไขปัญหาที่ผู้คนจะสังเกตเห็นหลังจากการเล่นอย่างต่อเนื่องไม่กี่วันนั้นไม่คุ้มค่า น่าเสียดายที่ฉันไม่สามารถหาวิธีแก้ปัญหาทั่วไปที่เรียบง่ายซึ่งแก้ไขปัญหาทั้งหมดได้โดยไม่ต้องดำเนินการตามข้อบกพร่องที่สำคัญ