अद्यतन विधि और यूनिटी में फिक्स्डअपडेट के बीच अंतर?


14

मैं यूनिटी 3 डी सीखना शुरू कर रहा हूं और मुझे जो भ्रम हो रहा है, उनमें से एक Update()और के बीच अंतर है FixedUpdate()

मैं वहां Lynda Unity 2D गेम डेवलपमेंट ट्यूटोरियल का अनुसरण कर रहा हूं, प्रशिक्षक Updateविधि का उपयोग करता है, खिलाड़ी के पास RigidBody2D घटक और बॉक्स कोलाइडर है, वह Updateखिलाड़ी का अनुवाद करने के लिए विधि का उपयोग करता है , लेकिन जब मैं Updateखिलाड़ी में ऐसा करता हूं तो वह नहीं हिलता है लेकिन मैं करता हूं यह FixedUpdate, सब कुछ काम करता है। वह यूनिटी 4.3 से ट्यूटोरियल दे रहा है और मैं यूनिटी 4.6 में कोर्स कर रहा हूं।

मैं कहाँ का उपयोग करना चाहिए Updateऔर FixedUpdate?

जवाबों:


14

मैं इसे एक टिप्पणी के रूप में लिखने जा रहा था, लेकिन यह लंबे समय तक समाप्त हो रहा था इसलिए मैंने इसे एक उत्तर में बदल दिया है।

वर्तमान उत्तर ज्यादातर सही हैं, लेकिन कुछ बातों का उल्लेख गलत / गलत है।

सामान्य तौर पर, अधिकांश गेम-प्ले संबंधित कार्य अंदर जाएंगे Update

उदाहरण के लिए, आप इनपुट के लिए मतदान नहीं करना चाहते FixedUpdate(प्रदर्शन के कारण नहीं, बल्कि इसलिए कि कॉल केवल सही तरीके से काम नहीं करेंगे)। एआई उसी नाव में गिरता है।

निरंतर अद्यतन भौतिकी एकमात्र गेमप्ले से संबंधित कार्य है FixedUpdateजिसका उपयोग किया जाना चाहिए। गैर-निरंतर / एक बार में चीजों को कॉल करना जैसे कि Physics.Raycast, या यहां तक Rigidbody.AddForceकि अंदर भी Update। मेरा उल्लेख इस बात के Rigidbody.AddForceविपरीत है कि दस्तावेज़ीकरण द्वारा क्या निहित हो सकता है, लेकिन कुंजी निरंतर बनाम गैर-निरंतर है।

एक बहुत बड़ा कारण केवल निरंतर भौतिकी FixedUpdateका वास्तविक स्वरूप है FixedUpdate। अन्य उत्तरों में उल्लेख किया गया है कि फिक्स्डयूडेट को एक निश्चित interval, but that's slightly misleading. In reality, a script is passed a time in Time.deltaTime/ Time.fixedDeltaTime* पर कैसे कॉल किया जाता है, जो कॉल के बीच वास्तविक समय से सीधे मेल नहीं खाता है, बल्कि कॉल के बीच सिम्युलेटेड समय।

(* Time.deltaTimeऔर Time.fixedDeltaTimeसमान मूल्य हैं जब में कहा जाता है FixedUpdate[एकता यह बताने में सक्षम है कि क्या वर्तमान कॉल के Time.deltaTimeदौरान FixedUpdateऔर रिटर्न की उत्पत्ति होती है Time.fixedDeltaTime])

स्वाभाविक रूप से एक ही Updateतरीके को अलग-अलग प्रदर्शन के कारण निरंतर तरीके से नहीं बुलाया जा सकता है, न ही कर सकते हैं FixedUpdate। मुख्य अंतर यह है कि, प्रत्येक फ्रेम, यदि FixedUpdateकॉल के बीच सही अंतराल को औसत करने के लिए अक्सर पर्याप्त नहीं कहा जा रहा है, तो इसे कई बार कहा जाता है (या औसत नहीं कहा जाता है) बहुत अधिक है। निष्पादन आदेश पर यह डॉक्स यह कहते हुए संदर्भित करता है कि फिक्स्डयूडेट को कई बार फ्रेम कहा जा सकता है:

... FixedUpdate: FixedUpdate को अक्सर अद्यतन से अधिक बार कहा जाता है। इसे फ्रेम प्रति कई बार कहा जा सकता है, यदि फ्रेम दर कम है और फ्रेम फ्रेम बहुत अधिक है तो इसे फ्रेम के बीच नहीं कहा जा सकता है ...

यह बाकी निष्पादन क्रम और इंजन की प्रकृति के कारण भौतिकी को प्रभावित नहीं करता है, लेकिन आपके द्वारा डाली गई किसी भी चीज़ के बारे में बस FixedUpdateप्रभावित होगा, और यह मुद्दों का कारण होगा।

उदाहरण के लिए, यदि आप AI प्रसंस्करण को अंदर रखते हैं, तो FixedUpdateयह मानने का कोई कारण नहीं है कि AI पंक्ति में कई फ़्रेमों के लिए अपडेट को छोड़ देगा। इसके अतिरिक्त, हर बार `फिक्स्डअपडेट पीछे छूट जाता है, आपके एआई को एक ही फ्रेम में कई बार अपडेट किया जाएगा, इससे पहले कि फिजिक्स और प्लेयर इनपुट / मूवमेंट जैसी चीज़ों को प्रोसेस किया जाता है, जो बहुत कम से कम प्रोसेसिंग की बर्बादी है, लेकिन यह भी बहुत मुश्किल होने की संभावना है बग और अनिश्चित व्यवहार को ट्रैक करने के लिए।

यदि आपको एक निश्चित अंतराल पर कुछ करने की आवश्यकता है तो अन्य तरीके जैसे एकता प्रदान करता है Coroutinesऔर उपयोग करता है InvokeRepeating

और एक छोटे नोट पर Time.deltaTimeऔर इसका उपयोग कब करना है:

Time.deltaTime के प्रभाव का वर्णन करने का सबसे आसान तरीका यह है कि यह इकाई प्रति फ्रेम से संख्या, इकाई प्रति सेकंड बदल जाती है । उदाहरण के लिए, यदि आपके पास transform.Translate(Vector3.up * 5)अपडेट जैसी कोई स्क्रिप्ट है, तो आप अनिवार्य रूप से 5 मीटर प्रति फ्रेम की दर से परिवर्तन को आगे बढ़ा रहे हैं । इसका मतलब है कि अगर फ्रैमरेट कम है तो मूवमेंट धीमा है, और अगर फ्रैमरेट ज्यादा है, तो मूवमेंट तेज है।

यदि आप उसी कोड को लेते हैं और इसे बदल देते हैं transform.Translate(Vector3.up * 5 * Time.deltaTime), तो ऑब्जेक्ट को 5 मीटर प्रति सेकंड की दर से स्थानांतरित किया जा रहा है । इसका मतलब यह है कि कोई फर्क नहीं पड़ता है, वस्तु हर सेकंड 5 मीटर आगे बढ़ जाएगी (लेकिन फ्रैमर्ट को धीमा कर देगा, कूदनेवाला ऑब्जेक्ट की गति दिखाई देगा क्योंकि यह अभी भी उसी राशि को हर X सेकंड में स्थानांतरित करता है)

सामान्य तौर पर, आप चाहते हैं कि आपका आंदोलन प्रति सेकंड हो। इस तरह से कोई फर्क नहीं पड़ता कि कंप्यूटर किस गति से चल रहा है, आपका भौतिकी / आंदोलन उसी तरह का व्यवहार करेगा, और आपके पास धीमे उपकरणों पर पॉपिंग अजीब कीड़े नहीं होंगे।

और इसका उपयोग करने का कोई मतलब नहीं है FixedUpdate। जैसा कि मैंने ऊपर उल्लेख किया है, आपको प्रत्येक कॉल (फिक्स्ड अपडेट टाइमस्टेप मान) के समान मूल्य मिलेगा, और यह आपके मूल्यों के लिए कुछ भी नहीं करेगा। आंदोलन / भौतिकी FixedUpdateको पहले से ही प्रति सेकंड इकाइयों में होने जा रहा है, इसलिए आपको इसकी आवश्यकता नहीं है।


4

Updateसमारोह हर फ्रेम कहा जाता है। इसकी आवृत्ति इस बात पर निर्भर करती है कि कंप्यूटर कितनी तेजी से छवियों को प्रस्तुत करने में सक्षम है। धीमे कंप्यूटर पर, Updateइसे तेज गति से कम बार कहा जाता है। यदि आप समय-आधारित गणना करते हैं, तो आप उनका उपयोग करके उन्हें सामान्य कर सकते हैं, Time.deltaTimeजो आपको बताता है कि पिछली बार Update(कबूतर लागू) कहा जाता है कि यह कितने समय से है ।
आप आम तौर पर Updateप्रदर्शन से संबंधित कार्य करने के लिए उपयोग करेंगे (जैसे कि यूआई तत्व को अपडेट करना)

FixedUpdateसमारोह तय अंतराल पर कहा जाता है। कोई फर्क नहीं पड़ता कि कितनी बार छवि ताज़ा होती है, प्रति सेकंड बार FixedUpdateकहा जाएगा आप आम तौर पर गेमप्ले से संबंधित कार्य करने के लिए उपयोग करेंगे (जैसे भौतिकी को अपडेट करना)1/Time.fixedDeltaTime
FixedUpdate


क्या यह Time.delta समय से गुणा करने का विकल्प है? क्या एक या दूसरे का उपयोग करने का कोई कारण है?
बेन

@ लेकिन उनके दो अलग-अलग लक्ष्य हैं और आप जो भी कर रहे हैं उसके लिए आपको सही फ़ंक्शन का उपयोग करना चाहिए।
ओ ० '।

@Lhoris क्षमा करें, मेरा मतलब है कि अद्यतन का उपयोग करने का एक कारण है और उन्हें फ्रेम स्वतंत्र बनाने के लिए Time.deltaTime द्वारा अपडेट और चीजों को गुणा करना?
बेन

@ हाँ, सटीक। धीमी रेंडरिंग वाली प्रणाली में, Updateकम और कम बार कहा जाता है, और आपके सिमुलेशन को इससे बहुत नुकसान होगा। सिमुलेशन सरल होने पर आप ध्यान नहीं दे सकते, लेकिन जब यह नहीं होगा तो यह आसानी से टूट जाएगा।
ओ ० '।

1
@ नहीं: यदि आप चाहते हैं कि आपका अनुकरण सटीक हो, तो आपको कई छोटे कदम उठाने होंगे, न कि हर बार बेतरतीब ढंग से बड़े या छोटे। और नहीं, FixedUpdate की पूरी बात यह है कि इसे कई बार कहा जाता है, कोई सवाल नहीं पूछा जाता है।
ओ ० '।

2

प्रेषक: http://unity3d.com/learn/tutorials/modules/beginner/scripting/update-and-fixedupdate

FixedUpdate में उपयोग किया जाने वाला समय-चरण परिवर्तनशील नहीं है।

यदि आपका गेम लैग होने लगता है, जब यह पकड़ लेता है, तो आप नहीं चाहते> एक अपडेट में भौतिकी के 10 सेकंड्स हों, इसलिए यह आमतौर पर फिक्स्डयूडेट में किया जाता है जिसे एक निश्चित अंतराल पर कहा जाता है।

उदाहरण के लिए:

Update(float elapsedSeconds)
{
  Position += Velocity * 34.23423; //Windows Update is self-important
}
FixedUpdate(float elapsedSeconds)
{
  Position += Velocity * 0.0166; //60fps
}

कहाँ पे:

Update(34.23423)

==

FixedUpdate(10.0)
FixedUpdate(10.0)
FixedUpdate(10.0)
//4.23423 + 5.76577 game-seconds later...
FixedUpdate(10.0)

मैंने अपने उत्तर में इसका उल्लेख किया है, लेकिन FixedUpdateवास्तव में एक निश्चित अंतराल पर नहीं बुलाया गया है। का वास्तविक स्वरूप FixedUpdateएक फ्रेम में भौतिकी के कई चक्रों को निचोड़ना है यदि आपका खेल चक्रों को छोड़ना शुरू करता है और यदि यह बहुत तेजी से चल रहा है तो साइकिल को छोड़ दें ताकि औसत फिक्स्ड अपडेट टाइमस्टेप पर काम करे। एकता बहु-थ्रेडेड नहीं है, इसलिए फिक्स्ड कॉल को एक निश्चित अंतराल पर कॉल करने की गारंटी देने का कोई तरीका नहीं होगा (क्या होता है जब एक फिक्स्डडेट बहुत लंबा हो जाता है)। यहां तक ​​कि अगर यह था तो शायद अभी भी असंभव के पास होगा।
सेलाली एडोबोर

अधिकांश [एकता?] लोगों को पता नहीं है कि रेंडर / अपडेट / फिक्स्डडेट सभी एक कॉलबैक विधि के भीतर से लागू होते हैं, इसलिए मैंने अवधारणा की। आपके प्रयास के लिए धन्यवाद!
जॉन

2

Updateजितनी जल्दी हो सके कहा जाता है। चर 'Time.deltaTime' अंतिम कॉल के बाद से गुजरे समय की वास्तविक राशि पर सेट है। यदि लैग या कुछ इसी तरह का खेल धीमा Updateहो जाता है , तब भी केवल एक बार लैग खत्म होने के बाद, उच्च मूल्य के साथ केवल एक बार कॉल किया जाएगा deltaTime

FixedUpdateनियमित अंतराल पर कहा जाता है। इसे 'Time.fixedDeltaTime' में निर्दिष्ट अनुपात से अधिक बार नहीं कहा जाएगा। यदि लैग या खेल के समान कुछ धीमा FixedUpdateहो जाता है , तो गेम को पकड़ने में सक्षम बनाने के लिए त्वरित उत्तराधिकार में कई बार बुलाया जाएगा। पहले चलाने के Time.deltaTimeलिए बराबर है , लेकिन यह केवल एक ठगना है जिससे दोनों के बीच कोड को स्थानांतरित करना आसान हो जाता है।Time.fixedDeltaTimeFixedUpdate

आम तौर पर, Updateपरस्पर व्यवहार के लिए इस्तेमाल किया जाना चाहिए औरFixedUpdate जिन्हें चरण-दर-चरण गणना की जानी चाहिए, या जो उन पर निर्भर करते हैं, जैसे कि भौतिकी आधारित आंदोलन। यदि आप Updateलाइनों के साथ-साथ किसी भी प्रकार के लूप लिख रहे हैं , for(time=0;time<=deltaTime;time+=someStep)...तो आपको संभवतः इसके बजाय फिक्स्डयूडेट में करना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.