अन्य उत्तर केवल अटकलें हैं, इसलिए मैंने एक सरल एकता परियोजना लिखी और इसे थोड़ी देर के लिए चलने दिया। कुछ घंटों के बाद यह परिणाम है:
UnityEngine.Time.time
सटीकता खो देता है बल्कि जल्दी। जैसा कि अपेक्षित था, 4 घंटे के लिए खेल चलाने के बाद मान 1 मिलीसेकंड से कूद जाते हैं, और उसके बाद अशुद्धि बढ़ जाती है।
UnityEngine.Time.deltaTime
एकता घंटों चलने के बाद भी अपनी प्रारंभिक उप-मिलीसेकंड सटीकता रखती है। इस प्रकार यह वस्तुतः गारंटी है कि deltaTime
एक प्लेटफ़ॉर्म-निर्भर उच्च रिज़ॉल्यूशन काउंटर (जो आमतौर पर 10-1000 वर्षों के बाद अतिप्रवाह) से प्राप्त होता है। एक छोटा जोखिम बना हुआ है जो deltaTime
अभी भी कुछ प्लेटफार्मों पर सटीक खो देगा।
समय की अशुद्धि सब कुछ के लिए एक मुद्दा है जो निर्भर करता है UnityEngine.Time.time
। एक विशिष्ट उदाहरण रोटेशन (जैसे एक पवनचक्की) है, जो आमतौर पर आधारित है UnityEngine.Mathf.Sin(UnityEngine.Time.time*rotationSpeed)
। यहां तक कि एक मुद्दे का अधिक है _Time
जो स्पष्ट रूप से shaders द्वारा एनिमेशन के लिए उपयोग किया जाता है। ध्यान देने योग्य होने से पहले अशुद्धि कितनी अधिक होनी चाहिए? 20-30 एमएस सटीकता (2 दिन) वह बिंदु होना चाहिए, जहां लोग इस मुद्दे से अवगत हों, और ध्यान दें। 50-100 एमएस (5-10 दिन) संवेदनशील लोगों को जो समस्या के बारे में नहीं जानते हैं, वे इसे समझाना शुरू कर देंगे। 200-300 एमएस (20-30 दिन) से समस्या स्पष्ट हो जाएगी।
अब तक मैं की सटीकता का परीक्षण नहीं किया _SinTime
, _CosTime
और Unity_DeltaTime
इसलिए मैं इन पर कोई टिप्पणी नहीं कर सकते हैं।
यह वह स्क्रिप्ट है जिसे मैंने परीक्षण के लिए उपयोग किया है। यह एक UI.Text
तत्व से जुड़ा हुआ है , परियोजना की प्लेयर सेटिंग्स पृष्ठभूमि में प्रोजेक्ट को चलाने की अनुमति देती है, और गुणवत्ता सेटिंग्स में VSync हर दूसरे वी ब्लैंक पर सेट है:
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
मंटिसा में कई एस नोटिस ।
समाधान
अधिकांश शैलियों को वर्कअराउंड की आवश्यकता नहीं है। अधिकांश खिलाड़ी 100 घंटों के लिए भी एक खेल नहीं खेलेंगे, इसलिए लोगों को एक समस्या को ठीक करने के लिए पैसे का निवेश केवल एक काल्पनिक समय के कुछ दिनों के बाद ही नोटिस करेगा, जो कि आर्थिक रूप से व्यवहार्य नहीं है। दुर्भाग्य से मैं एक साधारण सार्वभौमिक वर्कअराउंड के साथ नहीं आ सकता, जो कुछ महत्वपूर्ण कमियों को पूरा किए बिना समस्या की संपूर्णता को ठीक करता है।