क्रॉस प्लेटफॉर्म लो लेवल ग्राफिक एपीआई


11

सिस्टम एब्सट्रैक्शन बनाते समय प्लेटफ़ॉर्म के अलग-अलग एपीआई को एक सामान्य इंटरफ़ेस द्वारा सबसे निचले स्तर पर छिपाया जाना बेहतर होता है जो समझ में आता है।

अलग-अलग आधुनिक (बिना किसी निश्चित फ़ंक्शन पाइपलाइन के) देशी ग्राफिक्स API को ध्यान में रखते हुए: OpenGLES 2.0+, OpengGL 3.0+, DirectX 10.0+, Xbox DirectX 9, LibGCM

यदि उन सभी के ऊपर बैठने के लिए एक स्टेटलेस लो लेवल ग्राफिक एपीआई बनाया जाए, तो इसे पतली और उतनी ही तेजी से बनाने का सबसे अच्छा तरीका क्या होगा?


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

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

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

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

जवाबों:


6

मेरे दृष्टिकोण से सबसे निचला स्तर समझ में आता है, जो प्रतिपादन में शामिल संसाधनों के बारे में बात करता है - vb / ib, रेंडर सरफेस, टेक्सचर्स, शेड्स, स्टेट ब्लॉक इत्यादि।

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

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

(सिडेनोट: यदि आप प्लेटफ़ॉर्म-विशिष्ट ट्रिक्स को एक विशेष प्रकार के संसाधन के रूप में मानते हैं, तो आप इस पूरी अवधारणा को काफी दूर धकेल सकते हैं।)

तो एक तरह से, आप दो चीजें बनाएंगे: एक हार्डवेयर रिसोर्स मैनेजर, और एक टूलकिट इन संसाधनों का डीएजी स्थापित करने के लिए।


मैंने प्लेटफार्म-विशिष्ट चीजों को संसाधनों के रूप में मानने के बारे में कभी नहीं सोचा। यह एक बहुत अच्छा विचार लगता है! धन्यवाद।
निशाचरगॉन

10

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

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

यह एपीआई उपयोगकर्ता के लिए असमर्थित कार्यक्षमता के प्रबंधन को भी सरल करता है; यदि फ़ंक्शन X मौजूद है, तो उन्हें अब यह जांचने की आवश्यकता नहीं है कि कौन सी सुविधाएँ प्रभावित हैं, लेकिन यह निर्धारित करने के लिए केवल फ़ीचर क्वेरी की आवश्यकता है कि क्या यह वर्तमान कॉन्फ़िगरेशन के साथ समर्थित है। यहां तक ​​कि अगर आप सुविधाओं के लिए आंशिक या सीमित मोड का समर्थन करते हैं, तो प्रदान किया गया संदर्भ प्रबंधन को आसान बनाता है।

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


यह वास्तव में एक अच्छा आइडिया है। और यह उस डिज़ाइन का हिस्सा है जिसे मैं बनाने की कोशिश कर रहा हूं, लेकिन मेरे मन में जो बात थी, वह यह थी कि इस फीचर को एक सामान्य निम्न स्तर के एपीआई के ऊपर लागू किया जाए। लेकिन यह मामला हो सकता है कि कुछ विशेषताओं के लिए आपको कुछ और विशेष मामलों के लिए मूल API में गहरे रहना होगा।
रात्रि १०:५५ पर रात्रिचर

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

1

शुरू करने के लिए, प्रत्येक एपीआई चीजों को अलग-अलग तरीके से करता है इसलिए यह कहे बिना जाना चाहिए कि उपरोक्त सभी एपीआई को लपेटना मुश्किल होगा। उस ने कहा, कभी-कभी ऐसा करना आवश्यक होता है: कुछ बिंदु पर एक खेल को बस एक से अधिक प्लेटफॉर्म पर चलाने की आवश्यकता होती है, भले ही ऐसा करना कितना कठिन हो।

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

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


0

Emil Persson (Humus) द्वारा इसके बारे में GPU Pro पर एक लेख है

http://gpupro.blogspot.com/2009/12/making-it-large-beautiful-fast-and.html

रेंडरिंग के लिए एक क्रॉस-प्लेटफ़ॉर्म इंटरफ़ेस। एक होने के फायदे, और कैसे हमने DX9 को DX9 कंसोल के साथ एक सामान्य इंटरफ़ेस में ढाला और अच्छे प्रदर्शन को बनाए रखा।


-4

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


4
यह वास्तव में इस सवाल का जवाब नहीं देता है, यह उल्लेख नहीं करने के लिए कि ओपनजीएल और डायरेक्टएक्स दोनों को लपेटना बहुत संभव है (देखें ओग्रे 3 डी, इरेलिच, आदि)।
जेसन कोज़ाक

आपके द्वारा खेले गए खेलों पर विचार करें। उनमें से कितने के पास DirectX या OpenGL का उपयोग करने के विकल्प हैं? कि दोनों पुस्तकालयों में से किसी एक का समर्थन करने में सक्षम होने के लिए कितने रैपर हैं। आपके पास एक सीमित कल्पना है। :-P
Ricket

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

1
प्रश्न एक क्रॉस-प्लेटफॉर्म स्टेटलेस लो लेवल एपीआई के बारे में है। SDL और Allegro का इससे कोई लेना-देना नहीं है।
रात्रि १०:००

@NocturnDragon - प्रश्न शीर्षक थोड़ा भ्रामक है। पहली नज़र में मुझे उम्मीद थी कि प्रश्न एपीआई के विकल्पों के बारे में होगा, और मुझे लगता है कि यह उत्तरदाता ने भी किया।
a_m0d
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.