क्या एक बनावट (उस पर पेंटिंग) को संशोधित करना "राज्य परिवर्तन" माना जाता है?


11

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

क्या यह सच है अगर मैं एक बनावट के माध्यम से लगातार पेंटिंग कर रहा हूं glTexSubImage2D? मेरे पास (नेटवर्क पर) डेटा आने की एक धारा है जो प्रसंस्करण से गुजरती है और फिर एक समय में एक पंक्ति में एक बनावट में चित्रित होती है। डेटा को एक अंतहीन स्क्रॉल में नेत्रहीन रूप से प्रस्तुत किया जाता है।

क्या मैं एक बड़ी आयत पर चित्रित एक बनावट को पेंट करना बेहतर होगा (चित्रित डेटा को स्क्रॉल करना)? यहां विचार यह है कि मेरे पास एक (या दो) बनावट किसी भी समय पर होगी, जबकि मैं अभी इसे पेंट करना जारी रखता हूं।

या क्या मुझे बहुत सारी छोटी आयतों को चित्रित करना चाहिए (केवल पेंटिंग करते समय आयत को प्रकट करना)? मुझे लगता है कि मैं आयत प्रति एक बनावट को बांधूंगा।

जवाबों:


11

ग्राफिक्स डिवाइस में मेमोरी के एक क्षेत्र को अपडेट करना (एक बनावट, बफर और इसी तरह) एक रेंडरिंग स्टेट को बदलने के समान नहीं है।

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

दूसरी ओर एक बनावट / बफर अपडेट के लिए, मुख्य लागत डेटा ट्रांसफर में ही निहित है। सिद्धांत रूप में, जब तक आप अद्यतन के बाद सीपीयू में बनावट डेटा नहीं पढ़ रहे हैं, तब तक कोई सिंक्रनाइज़ेशन या पाइपलाइन स्टॉल नहीं होना चाहिए। हालांकि, एक और पहलू पर विचार किया जाना चाहिए: एपीआई ओवरहेड। यहां तक ​​कि अगर आप ग्राफिक्स डिवाइस को भेजे जाने वाले डेटा की मात्रा छोटी है, यदि आप अक्सर ऐसा करते हैं, तो अंततः ड्राइवर / डिवाइस के साथ संचार करने की लागत अधिक हो जाएगी, फिर डेटा ट्रांसफर की लागत। यही कारण है कि एक रेंडरर का अनुकूलन करते समय बैचिंग इतना महत्वपूर्ण है।

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

एक साइड नोट के रूप में, एनवीडिया द्वारा प्रस्तुत यह प्रस्तुति भी प्रासंगिक है और बहुत सारी अच्छी जानकारी प्रदान करती है: ओपनजीएल में जीरो ड्राइवर ओवरहेड का अनुमोदन करना


5
मुझे कुछ पता नहीं है, लेकिन मुझे निश्चित रूप से संदेह होगा कि glTexSubImage एक बनावट पर है जो अंतिम फ्रेम या दो में प्रस्तुत किया गया है, पाइपलाइन को रोक देगा, क्योंकि पीसी ड्राइवर अक्सर एक फ्रेम या दो को बफ़र करने की कोशिश करते हैं, और संभावना नहीं है एक छोटे से अद्यतन की वजह से संपूर्ण बनावट की प्रतियां बनाना चाहते हैं। इसलिए मुझे उम्मीद है कि अधिकतम प्रदर्शन के लिए बनावट (या पिक्सेल बफर ऑब्जेक्ट) से डबल-ट्रिपल-बफरिंग की आवश्यकता होगी।
जॉन कैल्सबीक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.