अपडेट विधि प्राप्त करने के लिए एकता प्रतिबिंब का उपयोग क्यों करती है?


12

क्यों पहुँच करने के क्रम में एकता उपयोग प्रतिबिंब करता है MonoBehaviourजैसे संदेश तरीकों Awake, Update, Start, ...?

क्या यह प्रतिबिंब का उपयोग करने के लिए धीमा नहीं होगा? यह अन्य दृष्टिकोणों का लाभ क्यों नहीं उठाता है Template Method? यह बस MonoBehaviourआधार वर्ग में सार के रूप में विधियों को परिभाषित कर सकता है और उपवर्गों को इसे लागू करने के लिए मजबूर कर सकता है।

जवाबों:


20

यह नहीं है

अपडेट को कैसे कहा जाता है

नहीं, एकता हर बार किसी को कॉल करने के लिए किसी मैजिक विधि को खोजने के लिए System.Reflection का उपयोग नहीं करती है।

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

खेल के दौरान एकता बस इन सूचियों के माध्यम से पुनरावृत्ति करती है और इससे विधियों को निष्पादित करती है - वह सरल। इसके अलावा, यही कारण है कि आपके अपडेट का तरीका सार्वजनिक या निजी होने से कोई फर्क नहीं पड़ता।

इस तरह से किए गए कारणों के लिए , मैं DMGregory के उत्तर में आपको (पाठक को) काफी हद तक संदर्भित करूंगा , जो दो प्रतिस्पर्धी चीजों के संतुलन को उबालता है :

  1. प्रदर्शन अनुकूलन
  2. नए डेवलपर उपयोग में आसानी

एक नया डेवलपर बस इसे काम करना चाहता है और यह पता लगाना नहीं चाहता है कि "मैं इसे इवेंट सिस्टम से कैसे जोड़ूं?" लेकिन यह अभी भी न्यूनतम ओवरहेड के साथ तेजी से चलना चाहिए।

समाधान शायद सबसे अच्छा है जो इन दो बाधाओं के भीतर प्राप्त किया जा सकता है । या कम से कम, सबसे अच्छा यूनिटी देव टीम उस समय के साथ आने में सक्षम थी। हम कभी नहीं जान सकते।


2
tl; डॉ एक ही प्रक्रिया, अलग, तेज एपीआई। लेकिन उन्होंने ओपी द्वारा पूछे गए एक अलग तरीके को क्यों नहीं चुना?
वंडर्रा

10
हमें सादे पुराने "खराब डिजाइन" कारण की संभावना से इनकार नहीं करना चाहिए। सी # स्रोत कोड के रिलीज के बाद उपयोगकर्ताओं को गलतियों और अस्पष्टीकृत डिजाइन निर्णयों के टन मिले हैं । कुछ gamedev अंततः उन अप्रत्याशित व्यवहारों को समझने में सक्षम थे जो वे वर्षों से लड़ रहे थे।
निर्गमन

एक तरफ की तकनीकी बातें यह है कि नई चीजें सीखने वाले पहले लोगों में से हैं, इसलिए इसे जोड़ना या छोड़ना आसान होना चाहिए।
निकस

6
इस डिजाइन के ऐतिहासिक कारण भी हो सकते हैं। एकता ने अपनी स्वयं की स्क्रिप्टिंग भाषा के साथ शुरुआत की, जिसे बाद में उन्होंने धीरे-धीरे C # के पक्ष में लिया। यह सिर्फ स्वाभाविक है कि वे समान पैटर्न का उपयोग करना चाहते थे, भले ही इसका मतलब थोड़ा धोखा देना हो।
फिलिप

3
मुझे लगता है कि हम उपयोगी उत्तर दे सकते हैं "इस तरह से एकता क्या पूरा करती है" - जैसे। एक सार सार्वजनिक तरीकों के संग्रह पर क्या लाभ है जो सभी को लागू करना चाहिए। हम जवाब नहीं दे सकते हैं "एकता देव क्या सोच रहे थे?" लेकिन हम "इंजन के उपयोगकर्ताओं के लिए उपयोगी क्यों है?"
DMGregory

10

यह केवल मोनोबीहेवियर बेस क्लास में विधियों को सार के रूप में परिभाषित कर सकता है और उपवर्गों को इसे लागू करने के लिए मजबूर कर सकता है।

सिस्टम का उपयोग करता है एकता का एक लाभ यह है कि आपको प्रत्येक मोनोबीहैवियर संदेश को लागू करने की आवश्यकता नहीं है, जिसमें से 60 से अधिक है

आमतौर पर हमें इन तरीकों में से एक या एक छोटे से मुट्ठी भर की जरूरत होती है। चूंकि कुछ 2 डी / 3 डी भौतिकी के लिए विशिष्ट हैं, कुछ कैमरे या कण प्रणालियों के लिए अद्वितीय हैं, यह अत्यधिक संभावना नहीं है कि किसी एक स्क्रिप्ट को कभी भी उन सभी की आवश्यकता होगी।

उन संदेशों को छोड़ कर जिनकी हमें आवश्यकता नहीं है, हम स्पष्ट रूप से रनटाइम को संकेत दे सकते हैं "इस ऑब्जेक्ट पर OnCollisionStay2D को कॉल करने पर भी परेशान न करें - मुझे इसकी आवश्यकता नहीं है"

यह एक पर्याप्त दक्षता जीत हो सकती है। अब इंजन शॉर्ट-लिस्ट को फ़िल्टर करने के लिए केवल ~ 20 ऑब्जेक्ट्स पर मेरे दृश्य में कॉल कर सकता है जिसे कस्टम अपडेट लॉजिक हर फ्रेम की आवश्यकता है, और सभी ~ 200 ऑब्जेक्ट्स जो सभी दृश्यों को बनाते हैं या केवल भौतिकी घटनाओं पर प्रतिक्रिया नहीं देते हैं।


बस एक प्रश्न ... जहाँ तक मुझे पता है (व्यक्तिगत रूप से नहीं), यदि आपके पास हजारों GameObjects हैं, जो सभी एक अपडेट विधि के साथ एक स्क्रिप्ट का उपयोग करते हैं, तो आपके पास महत्वपूर्ण प्रदर्शन प्रभाव हैं। वैकल्पिक का उपयोग सूचियों का उपयोग करना और उनके माध्यम से प्रबंधक स्क्रिप्ट में केवल एक अपडेट विधि के साथ पुनरावृति करना है , जो कि अधिक महत्वपूर्ण लगता है। क्या यह अभी भी मामला है, या क्या यह पहले से ही बदल गया है? - अगर कुछ नहीं बदला, तो इसका मतलब यह होगा कि एकता का प्रदर्शन करने का तरीका कहीं न कहीं प्रदर्शन के बारे में इष्टतम है।
बैटल

4
@Battle आप जो वर्णन करते हैं वह उस लिंक के अनुरूप है जो 2015 से Draco18s का हवाला देता है, और मुझे संदेह है कि यह अभी भी सच है। उन हजारों वस्तुओं पर अद्यतन विधि को अपरिभाषित छोड़ने में सक्षम होने के नाते यह ठीक है जो इस अनुकूलन को काम करने की अनुमति देता है। यदि प्रत्येक MonoBehaviour में एक अद्यतन पद्धति थी, जो एक सार आधार वर्ग के माध्यम से परिभाषित की गई थी, जैसा कि मैंने उद्धृत प्रश्न के अनुभाग में वर्णित है, तो हमारे पास प्रबंधक की सूची पुनरावृत्ति में अपनी अपडेट कॉल को सीमित करने की क्षमता नहीं होगी। ध्यान दें कि यह Q & A "क्या एकता का दृष्टिकोण इष्टतम है?" लेकिन केवल यह कि वर्तमान दृष्टिकोण किस तरह से लाभ का हो सकता है।
DMGregory

आह, मैं देख रहा हूँ कि वास्तव में समझ में आता है। जवाब के लिए धन्यवाद!
बैटल

@Battle यह अभी भी सच है। जबकि यूनिटी जो काम करती है, वह उन विकल्पों की तुलना में अधिक बेहतर है, जिनमें अभी भी एक नियमित फ़ंक्शन कॉल की तुलना में अधिक ओवरहेड है।
Draco18s अब

@ Draco18s - हाँ। मैंने अपनी परियोजनाओं के लिए पहले से ही एक अद्यतन प्रबंधक को लागू कर दिया है जो बहुत समय पहले उस अनुकूलन का ध्यान रखता है। मैं बस कुछ पुष्टि चाहता था कि यह अभी भी उपयोगी / उपयोगी है।
बैटल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.