यह सलाह वास्तव में प्रतिपादन के लिए विशिष्ट नहीं है, लेकिन ऐसी प्रणाली के साथ आने में मदद करनी चाहिए जो चीजों को काफी हद तक अलग रखती है। सबसे पहले 'गेमऑब्जेक्ट' डेटा को स्थिति की जानकारी से अलग रखने की कोशिश करें।
यह ध्यान देने योग्य है कि साधारण XYZ स्थिति जानकारी इतनी सरल नहीं हो सकती है। यदि आप एक भौतिक विज्ञान इंजन का उपयोग कर रहे हैं तो आप स्थिति डेटा को 3 पार्टी इंजन में संग्रहीत कर सकते हैं। आपको या तो उनके बीच तालमेल बैठाना होगा (जिसमें बहुत सारी व्यर्थ मेमोरी कॉपी करना शामिल होगा) या इंजन से सीधे सूचना को क्वेरी करना होगा। लेकिन सभी वस्तुओं को भौतिक विज्ञान की आवश्यकता नहीं है, कुछ को जगह में तय किया जाएगा ताकि तैरने का एक सरल सेट वहां ठीक काम करे। कुछ अन्य वस्तुओं से भी जुड़े हो सकते हैं, इसलिए उनकी स्थिति वास्तव में किसी अन्य स्थिति की भरपाई है। एक उन्नत सेटअप में आपको स्थिति केवल GPU पर संग्रहीत हो सकती है, केवल उसी समय इसकी आवश्यकता होगी जब कंप्यूटर पक्ष स्क्रिप्टिंग, भंडारण और नेटवर्क प्रतिकृति के लिए होता है। तो आप अपने संभावित डेटा के लिए कई संभावित विकल्प होंगे। यहाँ यह विरासत का उपयोग करने के लिए समझ में आता है।
किसी वस्तु के मालिक होने की बजाय यह स्थिति है, इसके बजाय उस वस्तु को एक अनुक्रमण डेटा संरचना के स्वामित्व में होना चाहिए। उदाहरण के लिए एक 'लेवल' में एक ऑक्ट्री हो सकती है, या शायद एक भौतिकी इंजन 'दृश्य'। जब आप रेंडरिंग दृश्य प्रस्तुत करना चाहते हैं (या सेटअप करना चाहते हैं), तो आप कैमरे के लिए दिखाई देने वाली वस्तुओं के लिए अपनी विशेष संरचना को क्वेरी करते हैं।
यह अच्छी मेमोरी मैनेजमेंट देने में भी मदद करता है। इस तरह से एक वस्तु जो वास्तव में एक क्षेत्र में नहीं है, उसमें एक स्थिति भी नहीं है जो 0.0 कोर्ड्स या उन कॉर्ड्स को वापस करने के बजाय समझ में आता है जो एक क्षेत्र में आखिरी बार थे।
यदि आप ऑब्जेक्ट के बजाय निर्देशांक को ऑब्जेक्ट में नहीं रखते हैं, तो ऑब्जेक्ट (।) के बजाय आप लेवल.गेट (ऑब्जेक्ट) को समाप्त कर देंगे। इसके साथ समस्या यह है कि स्तर में वस्तु को देख रहे हैं की संभावना धीमी गति से होगी क्योंकि इसे सभी वस्तुओं के माध्यम से देखना होगा और आपकी क्वेरी से मेल खाना चाहिए।
इससे बचने के लिए मैं शायद एक विशेष 'लिंक' क्लास बनाऊंगा। एक जो एक स्तर और एक वस्तु के बीच बांधता है। मैं इसे "स्थान" कहता हूं। इसमें xyz निर्देशांक के साथ-साथ स्तर को संभालना और ऑब्जेक्ट को हैंडल करना शामिल होगा। इस लिंक क्लास को स्पेसियल स्ट्रक्चर / लेवल में स्टोर किया जाएगा और ऑब्जेक्ट का इसमें कमजोर रेफरेंस होगा (यदि लेवल / लोकेशन नष्ट हो जाए तो ऑब्जेक्ट्स रिफ्रेंस को null करने के लिए अपडेट करना होगा। यह लोकेशन क्लास के वास्तव में होने के लायक भी हो सकता है। ऑब्जेक्ट 'स्वयं', इस तरह से यदि कोई स्तर हटा दिया जाता है, तो विशेष इंडेक्स संरचना, इसमें शामिल स्थान और इसके ऑब्जेक्ट हैं।
typedef std::tuple<Level, Object, PositionXYZ> Location;
अब स्थिति की जानकारी केवल एक ही स्थान पर संग्रहीत है। ऑब्जेक्ट, स्पेसियल इंडेक्सिंग संरचना, रेंडरर और इतने पर के बीच दोहराव नहीं।
ऑक्टीस जैसे स्पेसियल डेटा स्ट्रक्चर को अक्सर उन वस्तुओं के निर्देशांक की आवश्यकता नहीं होती है जिन्हें वे स्टोर करते हैं। वहाँ स्थिति संरचना में नोड्स के सापेक्ष स्थान में संग्रहीत की जाती है (इसे एक तरह की हानिपूर्ण संपीड़न के रूप में सोचा जा सकता है, तेजी से देखने के समय के लिए सटीकता का त्याग)। ऑक्ट्री में लोकेशन ऑब्जेक्ट के साथ फिर क्वेरी होते ही वास्तविक निर्देशांक इसके अंदर पाए जाते हैं।
या यदि आप अपने ऑब्जेक्ट स्थानों या दोनों के बीच मिश्रण का प्रबंधन करने के लिए भौतिकी इंजन का उपयोग कर रहे हैं, तो स्थान वर्ग को अपने सभी कोड को एक स्थान पर रखते हुए पारदर्शी रूप से संभालना चाहिए।
एक अन्य लाभ यह है कि स्थिति और स्तर के प्रतिशोध उसी स्थान पर संग्रहीत किया जाता है। आप object.TeleportTo (other_object) को लागू कर सकते हैं और यह स्तरों भर में काम कर सकता है। इसी तरह एआई पथ-खोज एक अलग क्षेत्र में कुछ का पालन कर सकता है।
प्रतिपादन के संबंध में। आपके रेंडर स्थान के लिए एक समान बाध्यकारी हो सकते हैं। सिवाय इसके वहाँ में प्रतिपादन विशिष्ट सामान होगा। संभवतः आपको इस संरचना में संग्रहित होने के लिए 'ऑब्जेक्ट' या 'स्तर' की आवश्यकता नहीं है। ऑब्जेक्ट उपयोगी हो सकता है यदि आप रंग उठाने जैसे कुछ करने की कोशिश कर रहे हैं, या इसके ऊपर तैरने वाला एक हिटबार रेंडर कर रहा है, लेकिन अन्यथा रेंडरर केवल मेष और इस तरह की परवाह करता है। RenderableStuff एक जाल होगा, इसमें बाउंडिंग बॉक्स आदि भी हो सकते हैं।
typedef std::pair<RenderableStuff, PositionXYZ> RenderThing;
renderer.render(level, camera);
renderer: object = level.getVisibleObjects(camera);
level: physics.getObjectsInArea(physics.getCameraFrustrum(camera));
for(object in objects) {
//This could be depth sorted, meshes could be broken up and sorted by material for batch rendering or whatever
rendering_que.addObjectToRender(object);
}
आपको इसे हर फ्रेम में करने की आवश्यकता नहीं हो सकती है, आप यह सुनिश्चित कर सकते हैं कि आप वर्तमान में दिखाए गए कैमरे से बड़ा क्षेत्र ले सकें। इसे कैश करें, ऑब्जेक्ट ऑब्जेक्ट्स को यह देखने के लिए ट्रैक करें कि क्या बाउंडिंग बॉक्स रेंज के भीतर आता है, कैमरा मूवमेंट को ट्रैक करता है और इसी तरह। लेकिन उस तरह के सामान के साथ गड़बड़ न करें जब तक कि आपने इसे बेंचमार्क नहीं किया।
आप भौतिकी इंजन में एक समान अमूर्तता हो सकती है, क्योंकि इसमें ऑब्जेक्ट डेटा, बस टकराव जाल और भौतिकी गुणों की भी आवश्यकता नहीं होती है।
आपके सभी मुख्य ऑब्जेक्ट डेटा में ऑब्जेक्ट का उपयोग करने वाली जाली का नाम होगा। गेम इंजन तब आगे बढ़ सकता है और इसे अपने ऑब्जेक्ट क्लास को रेंडर करने के बिना जो भी प्रारूप पसंद करता है उसमें लोड कर सकता है विशिष्ट चीजों को प्रस्तुत करने का एक गुच्छा (जो आपके रेंडरिंग एपीआई, यानी डायरेक्टएक्स बनाम ओपनजीएल के लिए विशिष्ट हो सकता है)।
यह अलग-अलग घटकों को अलग-अलग भी रखता है। इससे आपके भौतिकी इंजन को बदलने जैसी चीजों को करना आसान हो जाता है क्योंकि सामान एक स्थान पर अधिकतर स्वयं ही निहित होता है। यह भी unittesting बहुत आसान बनाता है। बिना किसी वास्तविक नकली ऑब्जेक्ट सेटअप के आप भौतिक प्रश्नों जैसी चीजों का परीक्षण कर सकते हैं, क्योंकि आपको केवल स्थान वर्ग की आवश्यकता है। तुम भी आसान सामान का अनुकूलन कर सकते हैं। यह और अधिक स्पष्ट करता है कि आपको कौन से वर्गों और एकल स्थानों पर उन्हें अनुकूलित करने के लिए कौन से प्रश्नों की आवश्यकता है (उदाहरण के लिए उपरोक्त स्तर ।getVanishObject वह होगा जहां आप चीजों को कैश कर सकते हैं यदि कैमरा बहुत आगे नहीं बढ़ता है)।
m_renderable
सदस्य के साथ बातचीत करें । इस तरह, आप अपने तर्क को बेहतर ढंग से अलग कर सकते हैं। सामान्य वस्तुओं पर रेंडर करने योग्य "इंटरफ़ेस" को लागू न करें जिसमें भौतिकी, एआई और व्हाट्सन भी हैं। उसके बाद, आप अलग से रेंडर प्रबंधन कर सकते हैं। आप चीजों को और भी अधिक खराब करने के लिए OpenGL फ़ंक्शन कॉल पर अमूर्तता की एक परत की आवश्यकता होती है। इसलिए, एक अच्छे इंजन की अपेक्षा न करें कि उसके विभिन्न रेंडर करने योग्य कार्यान्वयन के अंदर कोई GL API कॉल हो। यह एक सूक्ष्म संक्षेप में है।