संकल्पना
मौलिक रूप से, एक दृश्य ग्राफ एक द्वि-निर्देशित चक्रीय ग्राफ से अधिक कुछ नहीं है जो स्थानिक संबंधों के पदानुक्रम-संरचित सेट का प्रतिनिधित्व करने के लिए कार्य करता है।
जैसा कि नोट किया गया है, जंगली जीवों में दृश्य ग्राफ में अन्य अच्छाइयों को शामिल किया जाता है। चाहे आप देखते हैं कि मांस या गाय संभवतः आपके अनुभव पर निर्भर करता है कि वहां इंजन और पुस्तकालय हैं।
इसे लाइटवेट रखते हुए
मैं आपके दृश्य ग्राफ नोड होने के यूनिटी 3 डी शैली का समर्थन करता हूं (जो कि यह दिल है एक स्थानिक / स्थलाकृतिक संरचना के बजाय एक सामयिक है) स्वाभाविक रूप से स्थानिक मापदंडों और कार्यक्षमता को शामिल करते हैं। मेरे इंजन में, मेरे नोड्स यूनिटी 3 डी की तुलना में हल्के वजन के हैं, जहां वे सुपरक्लास / कार्यान्वित इंटरफेस से बहुत सारे अनावश्यक जंक सदस्यों को विरासत में देते हैं: यहां मेरे पास है - जितना प्रकाश आपको मिल सकता है:
- माता-पिता / बच्चे सूचक सदस्य।
- स्थानिक पैरामीटर सदस्यों को पूर्व-रूपांतरित करें: xyz स्थिति, पिच, यव और रोल।
- एक परिवर्तन मैट्रिक्स; एक पदानुक्रमित श्रृंखला में मेट्रिसेस बहुत जल्दी और आसानी से पेड़ के ऊपर / नीचे चलकर गुणा कर सकते हैं, जिससे आपको पदानुक्रमित स्थानिक रूपांतर मिलेंगे जो एक दृश्य ग्राफ की मुख्य विशेषता है;
- एक
updateLocal()
विधि जो केवल इस नोड के ट्रांसफॉर्म मैट्रेस को अपडेट करती है
- एक
updateAll()
विधि जो इसे अपडेट करती है और सभी वंशज नोड्स के रूपांतरण को बदलते हैं
... मैं अपने नोड वर्ग में समीकरण-ऑफ-मोशन लॉजिक और इस प्रकार वेग / त्वरण सदस्य (रैखिक और कोणीय) शामिल करता हूं। आप इसे आगे बढ़ा सकते हैं, और यदि आप चाहें तो इसे अपने मुख्य नियंत्रक में संभाल सकते हैं। लेकिन वह यह है - वास्तव में बहुत हल्का। याद रखें, आप हजारों संस्थाओं पर ये कर सकते हैं। इसलिए जैसा कि आपने सुझाव दिया है, इसे हल्का रखें।
पदानुक्रम का निर्माण
आप एक दृश्य ग्राफ के बारे में क्या कहते हैं जो अन्य दृश्य रेखांकन को संदर्भित करता है ... मैं पंचलाइन की प्रतीक्षा कर रहा हूं? बेशक वे करते हैं। यही उनका मुख्य उपयोग है। आप किसी भी नोड को किसी भी अन्य नोड में जोड़ सकते हैं, और नए परिवर्तन के स्थानीय स्थान में परिवर्तन स्वचालित रूप से होने चाहिए। आप जो कुछ भी कर रहे हैं वह एक पॉइंटर को बदल रहा है, ऐसा नहीं है कि आप डेटा की नकल कर रहे हैं! एक पॉइंटर बदलने से, आपके पास फिर एक गहरा दृश्य ग्राफ होता है। अगर प्रॉक्सी का उपयोग करना चीजों को और अधिक कुशल बनाता है तो हर तरह से, लेकिन मैंने कभी जरूरत नहीं देखी।
रेंडर से जुड़े लॉजिक से बचें
रेंडरिंग के बारे में भूल जाते हैं क्योंकि आप अपने दृश्य ग्राफ नोड क्लास को लिखते हैं, या आप अपने लिए चीजों को भ्रमित करेंगे। यह सब मायने रखता है कि आपके पास एक डेटा मॉडल है - चाहे वह दृश्य ग्राफ हो या नहीं, इससे कोई फर्क नहीं पड़ता - और कुछ रेंडरर उस डेटा मॉडल का निरीक्षण करने जा रहा है और उसके अनुसार दुनिया में वस्तुओं को प्रस्तुत करता है, चाहे वह 1, 2 में हो। , 3 या 7 आयाम। मैं जो बिंदु बना रहा हूं वह यह है: अपने दृश्य ग्राफ को तर्क प्रस्तुत करने के साथ दूषित न करें। एक दृश्य ग्राफ टोपोलॉजी और स्थलाकृति के बारे में है - अर्थात कनेक्टिविटी और स्थानिक विशेषताएं। ये अनुकार की वास्तविक स्थिति हैं और प्रतिपादन की अनुपस्थिति में भी मौजूद हैं (जो कि किसी व्यक्ति के पहले चित्र से लेकर आलेखीय विवरण तक सूर्य के नीचे कोई भी रूप ले सकता है)। नोड्स रेंडरिंग-संबंधित ऑब्जेक्ट को इंगित नहीं करते हैं - हालांकि रिवर्स अच्छी तरह से सच हो सकता है। इस पर भी विचार करें: आपके पूरे पेड़ में प्रत्येक दृश्य ग्राफ नोड रेंडर करने योग्य नहीं होगा। कई सिर्फ कंटेनर होंगे। तो एक पॉइंटर-टू-रेंडर-ऑब्जेक्ट के लिए मेमोरी क्यों आवंटित करें? यहां तक कि एक पॉइंटर सदस्य जो कभी भी उपयोग नहीं किया जाता है, अभी भी मेमोरी ले रहा है। इसलिए पॉइंटर दिशा को उल्टा करें: रेंडर-संबंधित उदाहरण डेटा मॉडल (जो आपके दृश्य ग्राफ नोड हो सकता है या शामिल हो सकता है) का संदर्भ देता है, न कि इसके विपरीत। और यदि आप नियंत्रक की अपनी सूची के माध्यम से चलाने का एक आसान तरीका चाहते हैं, फिर भी संबंधित दृश्य तक पहुंच प्राप्त करते हैं, तो एक शब्दकोश / हैशटेबल का उपयोग करें, जो ओ (1) पढ़ने के समय का उपयोग करता है। इस तरह से कोई संदूषण नहीं है, और आपके सिमुलेशन तर्क को परवाह नहीं है कि रेंडरर्स जगह में हैं, जो कोडिंग के आपके दिन और रात बनाता है तो एक पॉइंटर-टू-रेंडर-ऑब्जेक्ट के लिए मेमोरी क्यों आवंटित करें? यहां तक कि एक पॉइंटर सदस्य जो कभी भी उपयोग नहीं किया जाता है, अभी भी मेमोरी ले रहा है। इसलिए पॉइंटर दिशा को उल्टा करें: रेंडर-संबंधित उदाहरण डेटा मॉडल (जो आपके दृश्य ग्राफ नोड हो सकता है या शामिल हो सकता है) का संदर्भ देता है, न कि इसके विपरीत। और यदि आप नियंत्रक की अपनी सूची के माध्यम से चलाने का एक आसान तरीका चाहते हैं, फिर भी संबंधित दृश्य तक पहुंच प्राप्त करते हैं, तो एक शब्दकोश / हैशटेबल का उपयोग करें, जो ओ (1) पढ़ने के समय का उपयोग करता है। इस तरह से कोई संदूषण नहीं है, और आपके सिमुलेशन तर्क को परवाह नहीं है कि रेंडरर्स जगह में हैं, जो कोडिंग के आपके दिन और रात बनाता है तो एक पॉइंटर-टू-रेंडर-ऑब्जेक्ट के लिए मेमोरी क्यों आवंटित करें? यहां तक कि एक पॉइंटर सदस्य जो कभी भी उपयोग नहीं किया जाता है, अभी भी मेमोरी ले रहा है। इसलिए पॉइंटर दिशा को उल्टा करें: रेंडर-संबंधित उदाहरण डेटा मॉडल (जो आपके दृश्य ग्राफ नोड हो सकता है या शामिल हो सकता है) का संदर्भ देता है, न कि इसके विपरीत। और यदि आप नियंत्रक की अपनी सूची के माध्यम से चलाने का एक आसान तरीका चाहते हैं, फिर भी संबंधित दृश्य तक पहुंच प्राप्त करते हैं, तो एक शब्दकोश / हैशटेबल का उपयोग करें, जो ओ (1) पढ़ने के समय का उपयोग करता है। इस तरह से कोई संदूषण नहीं है, और आपके सिमुलेशन तर्क को परवाह नहीं है कि रेंडरर्स जगह में हैं, जो कोडिंग के आपके दिन और रात बनाता है और यदि आप नियंत्रक की अपनी सूची के माध्यम से चलाने का एक आसान तरीका चाहते हैं, फिर भी संबंधित दृश्य तक पहुंच प्राप्त करते हैं, तो एक शब्दकोश / हैशटेबल का उपयोग करें, जो ओ (1) पढ़ने के समय का उपयोग करता है। इस तरह से कोई संदूषण नहीं है, और आपके सिमुलेशन तर्क को परवाह नहीं है कि रेंडरर्स जगह में हैं, जो कोडिंग के आपके दिन और रात बनाता है और यदि आप नियंत्रक की अपनी सूची के माध्यम से चलाने का एक आसान तरीका चाहते हैं, फिर भी संबंधित दृश्य तक पहुंच प्राप्त करते हैं, तो एक शब्दकोश / हैशटेबल का उपयोग करें, जो ओ (1) पढ़ने के समय का उपयोग करता है। इस तरह से कोई संदूषण नहीं है, और आपके सिमुलेशन तर्क को परवाह नहीं है कि रेंडरर्स जगह में हैं, जो कोडिंग के आपके दिन और रात बनाता हैदुनिया आसान है।
पुलिंग के लिए, ऊपर देखें। एरिया-ऑफ-इंटरेस्ट कलिंग एक सिमुलेशन लॉजिक कॉन्सेप्ट है। यानी, आप इस (आमतौर पर बॉक्सिंग, गोलाकार या गोलाकार) क्षेत्र के बाहर की दुनिया को संसाधित नहीं करते हैं। रेंडरिंग होने से पहले यह मुख्य कंट्रोलर / गेम लूप में होता है। दूसरी ओर, फ्रिंज कलिंग विशुद्ध रूप से रेंडर-संबंधित है। इसलिए अभी से भूल जाना। इसका दृश्य आलेखों से कोई लेना-देना नहीं है, और इस पर ध्यान केंद्रित करके आप जो हासिल करने की कोशिश कर रहे हैं उसका सही उद्देश्य अस्पष्ट होगा।
एक अंतिम नोट ...
मुझे वह प्रबल अनुभूति होती है जो आप फ्लैश (विशेष रूप से एएस 3) पृष्ठभूमि से कर रहे हैं, यहां दिए गए रेंडरिंग के बारे में सभी विवरण दिए गए हैं। हां, फ्लैश स्टेज / डिस्प्लेऑबजेक्ट प्रतिमान में दृश्य के भाग के रूप में सभी रेंडर लॉजिक शामिल हैं। लेकिन फ्लैश बहुत सारी धारणाएं बनाता है जिन्हें आप जरूरी नहीं बनाना चाहते हैं। पूरी तरह से खेल इंजन के लिए, उचित SoC के माध्यम से कोड जटिलता के प्रदर्शन, सुविधा और नियंत्रण के कारणों के लिए, दोनों को मिश्रण नहीं करना बेहतर है ।