OpenGL के प्रत्यक्ष राज्य पहुंच तंत्र का क्या फायदा है?


11

मैं opengl.org पर OpenGL 4.5 डायरेक्ट स्टेट एक्सेस (DSA) के बारे में पढ़ रहा हूं और यकीन नहीं होता कि मैं सही हो रहा हूं।

इसका मतलब यह है कि पुराने तरीके कम कुशल हैं:

glBind(something)
glSetA(..)
glSetB(..)
glSetC(..)

नए तरीके से:

glSetA(something, ..)
glSetB(something, ..)
glSetC(something, ..)

इसके लुक से अब प्रत्येक glSetको glBind(something)इसके अंदर शामिल करना होगा और अगर ओपनगेल अभी भी स्टेट-मशीन है तो एकल पर लागू स्ट्रीम परिवर्तन का लाभ नहीं उठा सकता है something

कृपया नए डीएसए के पीछे के कारण और फायदे बताएं।

जवाबों:


21

इसके लुक से अब प्रत्येक ग्लसेट को इसके अंदर glBind (कुछ) को शामिल करना है

बिल्कुल नहीं। जैसा कि नीचे कई पैराग्राफ में वर्णित है, यह दूसरा तरीका है।

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

यदि OpenGL अभी भी एक स्टेट-मशीन है तो किसी एक चीज पर लागू स्ट्रीम परिवर्तन का लाभ नहीं उठा सकता है।

GPU राज्य मशीनें नहीं हैं। जीएल स्टेट मशीन इंटरफ़ेस एक एमुलेशन है जो डीएसए-जैसे ड्राइवर इंटर्नल को लपेटता है, न कि दूसरे तरीके से।

रैपिंग की एक परत को हटाने - एक परत जिसे जीएल सर्वर में अत्यधिक संख्या में कॉल की आवश्यकता होती है - स्पष्ट रूप से एक जीत है, भले ही एक छोटा हो।

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

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

कृपया नए डीएसए के पीछे के कारण और फायदे बताएं।

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

दूसरा प्रक्रियात्मक राज्य-मशीन एपीआई ओवरहेड था, जैसा कि पहले वर्णित है।

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

-

अतिरिक्त औचित्य और स्पष्टीकरण EXT_direct_state_access एक्सटेंशन विनिर्देश में दिया गया है ।

-

हार्डवेयर डिज़ाइन जो API डिज़ाइन के लिए प्रासंगिक हैं, बल्कि कई हैं।

याद रखें कि OpenGL 1991 की है। लक्ष्य हार्डवेयर उपभोक्ता-श्रेणी के ग्राफिक्स कार्ड नहीं थे (जो मौजूद नहीं थे) लेकिन बड़े CAD कार्यस्थान और पसंद करते हैं। उस युग के हार्डवेयर में आज की तुलना में बहुत अलग प्रदर्शन लिफाफे थे; मल्टी-थ्रेडिंग दुर्लभ था, मेमोरी बसें और सीपीयू में गति का अंतर कम था, और जीपीयू फिक्स्ड-फंक्शन त्रिकोण रेंडरिंग की तुलना में बहुत कम था।

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

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

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

आधुनिक हार्डवेयर क्लासिक ओपन मॉडल से आगे भी संचालित होता है। डीएसए एक छोटा सा परिवर्तन है जो कुछ 10+ साल पहले की आवश्यकता थी (इसे मूल रूप से ओपनजीएल 3.0 के हिस्से के रूप में वादा किया गया था), जैसा कि डी 3 डी 10 ने किया था। OpenGL को प्रासंगिक बनाए रखने के लिए ऊपर दिए गए हार्डवेयर परिवर्तनों में से कई को सिर्फ DSA से अधिक की आवश्यकता होती है, यही वजह है कि अभी भी अधिक बड़े एक्सटेंशन हैं जो OpenGL मॉडल को काफी बदल देते हैं । फिर पूरे नए GLnext API प्लस D3D12, मेंटल, मेटल आदि हैं, जिनमें से एक भी नहीं है, जिससे आउटमोडेड स्टेट मशीन अमूर्त बनी रहती है।


जवाब के लिए धन्यवाद। तो ऐसा लगता है कि कुछ बिंदु से पहले राज्य-मशीन (गैर-डीएसए) एक जीत थी, लेकिन कुछ बिंदु पर कुछ बदल गया है और अब डीएसए लाभप्रद है। क्या आपने कुछ प्रकाश डाला है जो बदल गया है?
Kromster

@KromStern: मेरी पूरी कोशिश की। यदि आपको अधिक विवरणों की आवश्यकता है, तो मेरे द्वारा आपूर्ति किए जाने की तुलना में अधिक जानकार कोई व्यक्ति।
सीन मिडिलडिच

@KromStern मैंने देखा है (इतिहास में मेरे सीमित शोध से) ओपनजीएल प्रति फ्रेम में सीपीयू पक्ष को कम और कम आकर्षित करने के लिए आगे बढ़ रहा है; प्रदर्शन सूचियाँ (वे क्या लायक थे), glDrawArays (एक कॉल में ड्रा), VBOs (एक बार GPU पर अपलोड करें), VAOs (एक बार विशेषताओं के लिए बाइंडर्स), वर्दी बफर ऑब्जेक्ट (एक बार में वर्दी सेट करें)। और भी कुछ है जो मुझे याद आ रहा है, मुझे यकीन है।
शाफ़्ट

@ratchetfreak: काफी मजेदार, अब हम दूसरे तरीके से आगे बढ़ रहे हैं। आधुनिक एपीआई / एक्सटेंशन हमारी फ्रेम कॉल प्रति फ्रेम बढ़ाने पर केंद्रित हैं, ज्यादातर उस सभी स्थिति को हटाकर जो प्रति ड्रॉ कॉल सेट / डिस्पैच करना पड़ता है और ड्रॉ कॉल को कमांड लाइन में "इन्सर्ट ड्रॉ कमांड" की तुलना में थोड़ा अधिक बनाता है स्थिर राज्य और बाइंडलेस संसाधनों का सेट। ऊह, निर्लज्ज, मैं अपने उत्तर में उस हिस्से का उल्लेख करना भूल गया।
शॉन मिडिलडाइच

@ सीनमिडलिच मुझे प्रति फ्रेम कॉल सेट करना चाहिए।
शाफ़्ट

1

ओवरव्यू इसे सही ठहराता है:

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

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

पसंद

oldState = glGet()
glBind()
glDoThings...
glSet(oldState)  // restore, in case anyone needs it just as they left it

संभवतया, पुराने हार्डवेयर को स्पष्ट स्थिति-बदलते एपीआई के साथ अधिक प्रदर्शन किया जा सकता है; यह एक बहुत ही अजीब अनुष्ठान है अन्यथा। इस विस्तार का तात्पर्य है (और केवल लेखकीय सूची को देखें!) जो कि भ्रूण को सेट करने, सेट करने, नृत्य को बहाल करने से अब वर्तमान हार्डवेयर पर एक प्रदर्शन जीत से अधिक है, यहां तक ​​कि प्रत्येक कॉल पर अतिरिक्त पैरामीटर के साथ।


"क्वेरी / स्टैश / चेंज / रिस्टोर करने की आवश्यकता है" - यह डीएसए के साथ कैसे बेहतर है?
Kromster

.. दिखाने के लिए कोडित छद्म कोड। डीएसए के साथ, इसमें से कोई भी आवश्यक नहीं है। वर्तमान में वर्तमान हार्डवेयर को वास्तव में "बाइंडिंग" स्थिति की आवश्यकता नहीं है, बस जरूरत के अनुसार इसे सभी तक पहुंच सकते हैं।
दाविद वैन ब्रिंक

श्रृंखला get/bind/do/setका उपयोग शायद ही कभी किया जाता है, क्योंकि 'गेट' बहुत धीमा है। आमतौर पर ऐप्स को वैसे भी वैरिएबल की प्रतिकृति को बनाए रखना होता है, इसलिए यह केवल नीचे की ओर जाता है bind/do। मैं हालांकि बिंदु को देखता हूं।
Kromster

2
ड्राइवर स्थिति से @krom तेज़ हो सकता है, कुछ गेटेबल स्टेट का GPU पर कोई व्यवसाय नहीं होता है, इसलिए इसे केवल RAM से प्राप्त किया जा सकता है जो तेज़ है।
शाफ़्ट सनकी 10
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.