पृष्ठभूमि:
मैं C ++ और OpenGL का उपयोग करके एक इकाई घटक प्रणाली प्रकार आर्किटेक्चर के लिए एक सरल 3D रेंडर सिस्टम डिज़ाइन कर रहा हूं। सिस्टम में एक रेंडरर और एक दृश्य ग्राफ होता है। जब मैं रेंडरर की पहली यात्रा समाप्त करता हूं, तो मैं ईसीएस आर्किटेक्चर में दृश्य ग्राफ वितरित कर सकता हूं। अभी के लिए यह एक तरह से या किसी अन्य स्थान पर प्लेसहोल्डर है। यदि संभव हो तो, रेंडरर के लिए मेरे लक्ष्य निम्नलिखित हैं:
- सादगी । यह एक शोध परियोजना के लिए है और मैं अपने सिस्टम को आसानी से बदलने और विस्तारित करने में सक्षम होना चाहता हूं (इसलिए ईसीएस दृष्टिकोण)।
- प्रदर्शन । मेरे दृश्य में कई छोटे मॉडल और बहुत सारे ज्यामिति के साथ बड़े वॉल्यूम भी हो सकते हैं। यह ओजीएल संदर्भ से वस्तुओं को प्राप्त करने और हर रेंडर फ्रेम को बफर ज्यामिति के लिए स्वीकार्य नहीं है। मैं कैश की कमी से बचने के लिए डेटा इलाके का लक्ष्य बना रहा हूं।
- लचीलापन । यह स्प्राइट्स, मॉडल और वॉल्यूम (स्वर) प्रस्तुत करने में सक्षम होना चाहिए।
- घोषित किया गया । जब मैं अपना रेंडर लिखता हूं तो दृश्य ग्राफ को कोर ईसीएस आर्किटेक्चर में बदल दिया जा सकता है।
- मॉड्यूलर । मेरे दृश्य ग्राफ को बदले बिना विभिन्न रेंडरर्स में स्वैप करने में सक्षम होना अच्छा होगा।
- प्रासंगिक पारदर्शिता , जिसका अर्थ है कि किसी भी समय मैं इसे कोई भी वैध दृश्य दे सकता हूं और यह हमेशा उस दृश्य के लिए एक ही छवि प्रदान करेगा। विशेष रूप से इस लक्ष्य की आवश्यकता नहीं है। मैंने सोचा कि यह दृश्य क्रमांकन को सरल बनाने में मदद करेगा (मुझे दृश्यों को सहेजने और लोड करने में सक्षम होने की आवश्यकता होगी) और परीक्षण / प्रयोग के प्रयोजनों के लिए रनटाइम के दौरान मुझे विभिन्न दृश्यों में स्वैप करने की सुविधा देगा।
समस्या और विचार:
मैं कोशिश करने के लिए कुछ अलग तरीकों के साथ आया हूं, लेकिन मैं प्रत्येक रेंडर नोड के लिए ओजीएल संसाधनों (वीएओ, वीबीओ, शेड्स, आदि) को कैश करने के लिए संघर्ष कर रहा हूं। निम्नलिखित विभिन्न कैशिंग अवधारणाएं हैं जो मैंने अब तक सोचा है:
- केंद्रीकृत कैश। प्रत्येक दृश्य नोड में एक आईडी है और रेंडरर के पास एक कैश है जो नोड्स को प्रस्तुत करने के लिए आईडी मैप करता है। प्रत्येक रेंडर नोड में जियोमेट्री से जुड़े VAO और VBO होते हैं। कैश मिस संसाधनों को प्राप्त करता है और ज्यामिति को कैश में रेंडर नोड के लिए मैप करता है। जब ज्यामिति बदली जाती है, तो एक गंदा झंडा लगाया जाता है। यदि रेंडरर दृश्य नोड्स के माध्यम से पुनरावृत्ति करते समय एक गंदा ज्यामिति ध्वज देखता है, तो यह रेंडर नोड का उपयोग करके डेटा को फिर से बनाता है। जब एक दृश्य नोड हटा दिया जाता है, तो एक घटना प्रसारित होती है और रेंडरर संसाधनों को जारी करते समय कैश से संबंधित रेंडर नोड को हटा देता है। वैकल्पिक रूप से, नोड को हटाने के लिए चिह्नित किया गया है और रेंडरर इसे हटाने के लिए जिम्मेदार है। मुझे लगता है कि यह दृष्टिकोण सबसे करीब से लक्ष्य 6 प्राप्त करता है, जबकि 4 और 5 पर भी विचार करता है। अतिरिक्त पहुंच और डेटा एक्सेस के नुकसान से ग्रस्त है।
- वितरित कैश । प्रत्येक दृश्य नोड को छोड़कर ऊपर एक समान है एक नोड प्रदान करता है। यह मैप लुकअप को बायपास करता है। डेटा स्थानीयता को संबोधित करने के लिए, रेंडर नोड्स को रेंडरर में संग्रहीत किया जा सकता है। तब दृश्य नोड्स के बजाय नोड्स रेंडर करने के लिए संकेत हो सकते थे और रेंडरर कैश मिस पर पॉइंटर सेट करता है। मुझे लगता है कि इस तरह की नकल एक इकाई घटक दृष्टिकोण है, इसलिए यह बाकी वास्तुकला के अनुरूप होगा। यहाँ समस्या यह है कि अब दृश्य नोड्स रेंडरर-कार्यान्वयन-विशिष्ट डेटा रखते हैं। यदि मैं बदलता हूं कि रेंडरर में चीजें कैसे प्रस्तुत की जाती हैं (जैसे स्प्राइट्स बनाम वॉल्यूम) तो मुझे अब रेंडर नोड को बदलने या दृश्य नोड (जो कि दृश्य ग्राफ को भी बदलने का मतलब है) में अधिक "घटक" जोड़ना होगा। प्लस साइड पर, यह मेरे पहले-पुनरावृत्ति रेंडर को ऊपर और चलाने के लिए सबसे सरल तरीका लगता है।
- वितरित मेटाडेटा । एक रेंडरर कैश मेटाडेटा घटक प्रत्येक दृश्य नोड में संग्रहीत किया जाता है। यह डेटा कार्यान्वयन-विशिष्ट नहीं है, बल्कि कैश द्वारा आवश्यक ID, प्रकार और किसी भी अन्य प्रासंगिक डेटा को रखता है। फिर कैश लुक-अप सीधे आईडी का उपयोग करके एक सरणी में किया जा सकता है, और प्रकार यह इंगित कर सकता है कि किस प्रकार का प्रतिपादन दृष्टिकोण का उपयोग करना है (जैसे स्प्राइट बनाम वॉल्यूम)।
- आगंतुक + वितरित मानचित्रण । रेंडरर एक विज़िटर है और विज़िटर नोड्स विज़िटर पैटर्न में तत्व हैं। प्रत्येक दृश्य नोड में एक कैश कुंजी (जैसे मेटाडेटा लेकिन सिर्फ एक आईडी) होती है, जो केवल रेंडरर हेरफेर करता है। आईडी का उपयोग सामान्यीकृत मैप लुक-अप के बजाय सरणी के लिए किया जा सकता है। रेंडरर दृश्य नोड के दृश्य नोड के प्रकार के आधार पर एक अलग रेंडरिंग फ़ंक्शन को भेजने की अनुमति दे सकता है, और आईडी का उपयोग किसी भी कैश द्वारा किया जा सकता है। एक डिफ़ॉल्ट या आउट-ऑफ-रेंज आईडी एक कैश मिस का संकेत देगा।
आप इस समस्या को कैसे हल करेंगे? या आपके पास कोई सुझाव है? पाठ की मेरी दीवार पढ़ने के लिए धन्यवाद!