OpenGL> = 3 केवल VBO को अनुमति क्यों देता है?


21

मुझे लगता है कि OpenGL संस्करण 3 और क्लाइंट-साइड रेंडरिंग के उपयोग को समाप्त करता है। तत्काल मोड को समाप्त कर दिया गया है, और शीर्ष सरणियों को पदावनत किया जा रहा है। इसके बजाय, अगर मैं सही तरीके से समझूं, तो वीबीओ लंबों को प्रस्तुत करने का मुख्य तरीका है।

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

एक और चिंता का विषय यह है कि मैं जिस ज्यामिति का प्रतिपादन कर रहा हूं वह अत्यधिक गतिशील हो सकता है। सबसे खराब स्थिति में, ऐसे समय हो सकते हैं जब सभी ज्यामिति को हर फ्रेम में कुछ समय के लिए नाराज होना पड़ता है। क्या VBO का इस उपयोग के मामले में वर्टेक्स ऐरे की तुलना में खराब प्रदर्शन होगा, या VBOs कम से कम वर्टेक्स एरे के रूप में ज्यादा काम करते हैं, लेकिन अब और नहीं?

इसलिए, अधिक संक्षिप्त प्रारूप में, मेरे प्रश्न हैं:

1) क्या VBO को आवंटित / डील करने के लिए पर्याप्त ओवरहेड है (मेरा मतलब है एक बफर स्थापित करने का कार्य)?

2) अगर मैं हर फ्रेम में सीपीयू से डेटा अपडेट कर रहा हूं, तो क्या यह काफी खराब हो सकता है अगर मैंने वर्टेक्स एरेज़ का इस्तेमाल किया हो?

और अंत में, मैं जानना चाहूंगा:

3) यदि उपरोक्त में से किसी भी प्रश्न का उत्तर "हाँ" है, तो रेंडरिंग के अन्य तरीकों को क्यों दर्शाया गया है जो कि एचबीओ पर लाभ हो सकता है? क्या कुछ ऐसा है जो मैं यहाँ याद कर रहा हूँ, जैसे कि तकनीक मैं इन संभावित आवंटन लागतों में से कुछ को कम करने के लिए उपयोग करने वाला हूं, आदि?

4) क्या इन सवालों में से किसी का जवाब काफी हद तक इस बात पर निर्भर करता है कि मैं OpenGL संस्करण का उपयोग कर रहा हूं? यदि मैं अपने कोड को OpenGL 3 या 4 को अग्रेषित करता हूं तो VBOs का उपयोग करके एक तरह से आगे-संगत है, जो प्रदर्शन योग्य है, क्या वही तकनीक OpenGL 2 के साथ अच्छा प्रदर्शन करने की संभावना होगी, या क्या यह संभव है कि कुछ तकनीकें OpenGL 3 के साथ अधिक तेज़ हैं + और दूसरों के साथ OpenGL 2?

मैंने स्टैक ओवरफ्लो पर यह सवाल पूछा था, लेकिन मैं यहां फिर से पोस्ट कर रहा हूं क्योंकि मुझे एहसास हुआ कि यह साइट मेरे प्रश्न के लिए अधिक उपयुक्त हो सकती है।


1
क्यों एक वोट बंद? क्या यह एक डुबकी है? यदि हां, तो क्या मैं एक लिंक देख सकता हूं ताकि मैं इससे लाभान्वित हो सकूं?
गुरुत्वाकर्षण

जवाबों:


23

क्या VBO को आवंटित करने / डील करने के लिए पर्याप्त उपरि है (मेरा मतलब है कि एक बफर स्थापित करने का मात्र कार्य)?

परिभाषित करें "पर्याप्त"। यह आमतौर पर बुद्धिमान होता है कि उन्हें फ्रेम के बीच में न बनाएं; उन्हें आरंभीकरण के दौरान या जहां भी स्थापित किया जाना चाहिए। लेकिन यह अधिकांश OpenGL ऑब्जेक्ट का सच है, जैसे टेक्सचर, रेंडरबफर्स ​​या शेड्स।

अगर मैं हर फ्रेम में सीपीयू से डेटा अपडेट कर रहा हूं, तो क्या यह काफी खराब हो सकता है अगर मैंने वर्टेक्स एरेज़ का इस्तेमाल किया हो?

यह कर सकते हैं? हाँ। OpenGL कार्यक्षमता को परिभाषित करता है, प्रदर्शन नहीं । आप वास्तव में चीजों को बहुत धीमा कर सकते हैं। या आप चीजों को तेज कर सकते हैं। यह सब इस बात पर निर्भर करता है कि आप इसका उपयोग कैसे करते हैं।

ओपनजीएल विकी के पास डेटा को ठीक से स्ट्रीम करने के तरीके पर एक अच्छा लेख है

यदि उपरोक्त में से किसी भी प्रश्न का उत्तर "हां" है, तो रेंडरिंग के अन्य तरीकों को क्यों दर्शाया गया है जो वीबीओ पर लाभ हो सकता है? क्या कुछ ऐसा है जो मैं यहाँ याद कर रहा हूँ, जैसे कि तकनीक मैं इन संभावित आवंटन लागतों में से कुछ को कम करने के लिए उपयोग करने वाला हूं, आदि?

सबसे पहले, वे सिर्फ पदावनत नहीं थे। अवक्षेपण का अर्थ है भविष्य के संस्करणों में "हटाए जाने" के रूप में कुछ चिह्नित करना। उन्हें 3.0 में पदावनत किया गया, और 3.1 कोर और उससे अधिक में हटाया गया।

दूसरा, एआरबी ने आमतौर पर ओपनगेल से सामान निकालने का कारण बताया है। यह कल्पना को छोटा और सरल बनाता है। यह एपीआई को छोटा और अधिक सुव्यवस्थित बनाता है। यह जानना आसान बनाता है कि आपके द्वारा उपयोग किए जा रहे एपीआई क्या हैं; 2.1 के पास शीर्ष डेटा प्रदान करने के 4 तरीके थे; ३.१+ में १ है। यह बहुत सारे क्रुट से छुटकारा दिलाता है। आदि।

क्या इनमें से किसी भी सवाल का जवाब काफी हद तक बदल जाता है, जो इस बात पर निर्भर करता है कि OpenGL संस्करण मैं क्या उपयोग कर रहा हूं? यदि मैं अपने कोड को OpenGL 3 या 4 को अग्रेषित करता हूं तो VBOs का उपयोग करके एक तरह से आगे-संगत है, जो प्रदर्शन योग्य होगा, वही तकनीक OpenGL 2 के साथ अच्छा प्रदर्शन करने की संभावना होगी, या क्या यह संभव है कि कुछ तकनीकें OpenGL 3 के साथ बहुत तेज़ हैं + और अन्य OpenGL 2 के साथ?

कमोबेश न के बराबर। केवल MacOSX में 3.1 + कोर और पूर्व 3.0 संस्करणों के बीच का अंतर वास्तव में स्पष्ट रूप से है। संगतता प्रोफ़ाइल को लिनक्स और विंडोज के लिए सभी ड्राइवरों द्वारा कार्यान्वित किया जाता है, इसलिए आप यह मान सकते हैं कि इन ड्राइवरों से मुख्य प्रोफ़ाइल वास्तव में आपको संगतता कार्यों को कॉल करने से रोकने के लिए चेक जोड़ रही है।

के तहत मैक OSX 10.7, जीएल 3.2 कोर उपलब्ध है, लेकिन नहीं अनुकूलता प्रोफ़ाइल। यह जरूरी नहीं कि एक बनाम दूसरे पर प्रदर्शन तकनीकों के लिए कुछ भी हो। लेकिन इसका मतलब यह है कि यदि मतभेद हैं, तो यही वह मंच है जिस पर आप उन्हें देखेंगे।


1
चूंकि आपने इस प्रश्न को अभी - अभी पोस्ट किया है , इसलिए मैं अपना उत्तर अभी-अभी पोस्ट करूंगा।
निकोल बोलस

API को संक्षिप्त रखने का एक और लाभ यह है कि यह OpenGL API को कार्यान्वित करना आसान बनाता है। यह मूल OpenGL ES कल्पना में एक बड़ा विचार था।
notlesh

@stephelton: समझ में आता है। मेरा "क्यों सब कुछ दर्शाया गया है, लेकिन VBOs" सवाल इस सोच पर आधारित था कि जब यह एपीआई को दुबला रखने के लिए सही समझ में आता है, तो यह उन सुविधाओं को चित्रित करने का कोई मतलब नहीं है जो कई उपयोग के मामलों के लिए VBO से बेहतर हो सकते हैं। जो मैं सुन रहा हूं, उससे ऐसा लगता है कि वीबीओ का उपयोग करने के लिए कोई नुकसान नहीं है, हालांकि, फिर यह बाकी सब चीजों को चित्रित करने के लिए एकदम सही समझ में आता है।
ग्रेविटी

@ गुरुत्व आपको वीबीओ का उपयोग करने की आवश्यकता नहीं है । आप वर्टिकल की एक सरणी का भी उपयोग कर सकते हैं।
नॉटलेश

18

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

अस्थायी आवंटन को तेज करने के लिए कुछ ड्राइवर-साइड ट्रिक हो सकते हैं, लेकिन नकल से बचने के लिए आप कुछ भी नहीं कर सकते हैं।

तो हाँ, जब तक आप - और चालक डेवलपर्स - सब कुछ सही करते हैं, VBOs (tm) को हमेशा चीजों को गति देना चाहिए।


6
मुझे यह उत्तर बेहतर लगा। यह कम और अधिक बिंदु तक नीचे है, imo।
ट्रैविसग

@JariKomppa: यह एक बहुत ही उचित व्याख्या की तरह लगता है। मुझे अभी भी एक चिंता है: वीबीओ को काफी बड़ी वस्तुओं के रूप में माना जाता है, जिसे अक्सर 1 एमबी - 4 एमबी बफ़र्स के रूप में आवंटित किया जाता है जब मैंने पिछली बार जाँच की थी। क्या होगा यदि मेरी ज्यामिति वस्तुएं इतनी बड़ी नहीं हैं, लेकिन मैं अभी भी प्रदर्शन के बारे में चिंतित हूं क्योंकि मेरे पास बहुत सारी वस्तुएं हैं? मुझे चिंता है कि वीबीओ सिर्फ मेरे पास एक अलग उपयोग के मामले में हो सकता है। क्या मुझे एक ही VBO में एक साथ कई ऑब्जेक्ट्स को पूल करना चाहिए और फिर glDrawRangeElementsप्रत्येक अलग-अलग ऑब्जेक्ट को खींचने के लिए उपयोग करना चाहिए, या क्या यह केवल शीर्ष सरणियों की तरह अक्षम है?
गुरुत्वाकर्षण

मुझे संदेह है कि इससे कोई फर्क पड़ेगा, लेकिन अगर आपको लगता है कि यह एक चिंता का विषय है, तो इसे मान लें।
जरी कोमप्पा

@ जरीकोम्पा: आपको क्या संदेह है इससे फर्क पड़ेगा? glDrawRangeElementsप्रत्येक VBO पर कुछ VBO के साथ कई बार उपयोग करने के बजाय प्रत्येक वस्तु को अपना VBO देना?
गुरुत्वाकर्षण

1
ठीक ठीक। मुझे संदेह है कि आपको वहां बहुत अंतर दिखाई देगा, लेकिन कुछ परीक्षण मामलों की रूपरेखा आपको अधिक जानकारी देनी चाहिए। मैं भी अब इसके बारे में चिंता नहीं करेगा, जैसे कि अगर जरूरत हो तो बाद में इसे लागू किया जा सकता है।
जरी कोमप्पा

9

और शीर्ष सरणियाँ पदावनत लगती हैं। इसके बजाय, अगर मैं सही ढंग से समझता हूं,

काफी नहीं। वर्टेक्स सरणियां वर्टेक्स बफर ऑब्जेक्ट्स के लिए नींव हैं। केवल संग्रहण क्लाइंट से सर्वर की ओर ले जाया गया।

क्या होगा अगर मेरे पास एक दृश्य है जिसमें बहुत छोटी ज्यामिति है?

छोटे ज्यामिति को बड़े VBO में सेट करता है। जियोमेट्री बैच प्रति एक VBO होने की कोई आवश्यकता नहीं है। आप पूरी तरह से प्रतिपादन के लिए एक VBO के सबसेट को संबोधित कर सकते हैं। Gl… सूचक डेटा पैरामीटर के लिए नॉनज़ेरो ऑफ़सेट का उपयोग करें।

2) अगर मैं हर फ्रेम में सीपीयू से डेटा अपडेट कर रहा हूं, तो क्या यह काफी खराब हो सकता है अगर मैंने वर्टेक्स एरेज़ का इस्तेमाल किया हो?

इसके लिए GL_DYNAMIC_DRAW और GL_STREAM_DRAW बफर उपयोग ध्वज हैं।

यदि उपरोक्त में से किसी भी प्रश्न का उत्तर "हां" है, तो रेंडरिंग के अन्य तरीकों को क्यों दर्शाया गया है जो वीबीओ पर लाभ हो सकता है?

क्योंकि फायदे नहीं हैं। जियोमेट्री डेटा को किसी भी स्थिति में GPU में स्थानांतरित किया जाना है। नियमित क्लाइंट साइड वर्टेक्स ऐरे का उपयोग करने से अभी भी जीपीए में डीएमए ट्रांसफर होगा, और तत्काल मोड पहले भी ट्रांसफर करने के लिए एक बैच का निर्माण करेगा।

VBOs का उपयोग नहीं करने में बिल्कुल कोई लाभ नहीं है।


इसलिए मेरा प्रदर्शन आमतौर पर VBOs के साथ वर्टेक्स एरे के साथ खराब नहीं होना चाहिए, लेकिन केवल अगर मैंने GL_STREAM_DRAW को सही तरीके से सेट किया है?
गुरुत्व

@ गुरुत्वाकर्षण: वास्तव में। हालाँकि, बफर मोड केवल अपेक्षित उपयोग होने के लिए एक संकेत है, लेकिन निश्चित रूप से संकेत है कि आप क्या करने जा रहे हैं के लिए सच होना चाहिए। यह भी मत भूलो कि आप अपडेट (glMapBuffer, glUnmapBuffer) के लिए अपने प्रोसेस एड्रेस स्पेस में बफ़र्स मैप कर सकते हैं।
डेटेनवुल्फ़

लेकिन तब बफर वीआरएएम में नहीं हो सकता है, है ना? या यह अभी भी वीआरएएम में होगा, लेकिन प्रक्रिया-स्थान के पते के माध्यम से केवल पता योग्य होगा? क्या इस तकनीक के साथ रैंडम एक्सेस सस्ता होगा, या क्या मुझे अभी भी बहुत कम संख्या में सन्निहित श्रेणियों को अपडेट करने की कोशिश करनी चाहिए?
गुरुत्वाकर्षण

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