मेरे होमब्रेव रेंडरिंग सिस्टम में संसाधनों को कैशे कैसे करें


10

पृष्ठभूमि:

मैं C ++ और OpenGL का उपयोग करके एक इकाई घटक प्रणाली प्रकार आर्किटेक्चर के लिए एक सरल 3D रेंडर सिस्टम डिज़ाइन कर रहा हूं। सिस्टम में एक रेंडरर और एक दृश्य ग्राफ होता है। जब मैं रेंडरर की पहली यात्रा समाप्त करता हूं, तो मैं ईसीएस आर्किटेक्चर में दृश्य ग्राफ वितरित कर सकता हूं। अभी के लिए यह एक तरह से या किसी अन्य स्थान पर प्लेसहोल्डर है। यदि संभव हो तो, रेंडरर के लिए मेरे लक्ष्य निम्नलिखित हैं:

  1. सादगी । यह एक शोध परियोजना के लिए है और मैं अपने सिस्टम को आसानी से बदलने और विस्तारित करने में सक्षम होना चाहता हूं (इसलिए ईसीएस दृष्टिकोण)।
  2. प्रदर्शन । मेरे दृश्य में कई छोटे मॉडल और बहुत सारे ज्यामिति के साथ बड़े वॉल्यूम भी हो सकते हैं। यह ओजीएल संदर्भ से वस्तुओं को प्राप्त करने और हर रेंडर फ्रेम को बफर ज्यामिति के लिए स्वीकार्य नहीं है। मैं कैश की कमी से बचने के लिए डेटा इलाके का लक्ष्य बना रहा हूं।
  3. लचीलापन । यह स्प्राइट्स, मॉडल और वॉल्यूम (स्वर) प्रस्तुत करने में सक्षम होना चाहिए।
  4. घोषित किया गया । जब मैं अपना रेंडर लिखता हूं तो दृश्य ग्राफ को कोर ईसीएस आर्किटेक्चर में बदल दिया जा सकता है।
  5. मॉड्यूलर । मेरे दृश्य ग्राफ को बदले बिना विभिन्न रेंडरर्स में स्वैप करने में सक्षम होना अच्छा होगा।
  6. प्रासंगिक पारदर्शिता , जिसका अर्थ है कि किसी भी समय मैं इसे कोई भी वैध दृश्य दे सकता हूं और यह हमेशा उस दृश्य के लिए एक ही छवि प्रदान करेगा। विशेष रूप से इस लक्ष्य की आवश्यकता नहीं है। मैंने सोचा कि यह दृश्य क्रमांकन को सरल बनाने में मदद करेगा (मुझे दृश्यों को सहेजने और लोड करने में सक्षम होने की आवश्यकता होगी) और परीक्षण / प्रयोग के प्रयोजनों के लिए रनटाइम के दौरान मुझे विभिन्न दृश्यों में स्वैप करने की सुविधा देगा।

समस्या और विचार:

मैं कोशिश करने के लिए कुछ अलग तरीकों के साथ आया हूं, लेकिन मैं प्रत्येक रेंडर नोड के लिए ओजीएल संसाधनों (वीएओ, वीबीओ, शेड्स, आदि) को कैश करने के लिए संघर्ष कर रहा हूं। निम्नलिखित विभिन्न कैशिंग अवधारणाएं हैं जो मैंने अब तक सोचा है:

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

आप इस समस्या को कैसे हल करेंगे? या आपके पास कोई सुझाव है? पाठ की मेरी दीवार पढ़ने के लिए धन्यवाद!


1
क्या आपने कोई प्रगति की है?
एंड्रियास

यह एक अत्यंत जटिल प्रश्न है, और संभवतः इसे कई अलग-अलग प्रश्नों में विभाजित किया जाना चाहिए। यह अनिवार्य रूप से पूछ रहा है "मुझे अपना इंजन कैसे डिज़ाइन करना चाहिए?" मेरी सलाह होगी कि आप पहले सरल घटकों का समर्थन करने वाली किसी चीज़ को डिज़ाइन करें, फिर जैसे ही आप जाएं, रिफ्लेक्टर सुविधाएँ जोड़ें। इसके अलावा, 3 डी गेम इंजन डिज़ाइन की पुस्तकों को देखें, जिसमें आपको बहुत सी जानकारी को कवर करना चाहिए।
इयान यंग

जवाबों:


2

आपके प्रश्न को फिर से पढ़ने के बाद, मैं दृढ़ता से महसूस करता हूं कि आप समस्या पर काबू पा रहे हैं। यहाँ पर क्यों:

  1. वास्तव में केवल दो प्रकार के रेंडरिंग सिस्टम हैं: फॉरवर्ड, और डिफर्ड, जिनमें से कोई भी एक दृश्य ग्राफ पर निर्भर नहीं है।

  2. केवल प्रदर्शन समस्याएं जो आपको वास्तव में किसी भी रेंडरिंग सिस्टम के साथ मिलनी चाहिए, उच्च पॉली काउंट और अकुशल शेडर और क्लाइंट कोड से आना चाहिए।

  3. कैश मिस वास्तव में प्रदर्शन को कम करते हैं, लेकिन वे काफी राक्षस नहीं हैं जो आपको लगता है कि वे हो सकते हैं। आपके प्रदर्शन में सुधार का 80% एक अधिक कुशल एल्गोरिदम से होगा। अपने कोड के पूर्व-अनुकूलन की गलती न करें।

ने कहा कि:

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

आपके सामने आने वाली समस्याओं से निपटने के लिए निश्चित रूप से अन्य तरीके हैं, लेकिन मैं बहुत लंबा जवाब देना नहीं चाहता। तो, मेरी सबसे अच्छी सलाह है कि पहले कुछ सरल काम कर लें, फिर उस पर विस्तार करें ताकि यह कमजोर हो, फिर अन्य दृष्टिकोणों के साथ प्रयोग करें और देखें कि अभ्यास में उनकी ताकत / कमजोरी कहां है।

फिर आपको सूचित निर्णय लेने के लिए अच्छी तरह से रखा जाएगा।

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