एपीआई अज्ञेय पुल (यानी। OpenGL / D3D / जो भी हो)। क्या आप उनका उपयोग करते हैं, आप उन्हें कैसे बनाते हैं। प्रो और कॉन का [बंद]


12

आप एक 3D इंजन बना रहे हैं। आप मल्टीप्लायर दुनिया के सर्वश्रेष्ठ चाहते हैं। अचानक आपको एहसास होता है कि यदि आप विंडोज़ मशीनों पर डायरेक्ट 3 डी और ओएसएक्स / लिनक्स पर ओपनजीएल का उपयोग करना चाहते हैं, तो आपको कम से कम सामान्य भाजक दोनों की समर्थित सुविधाओं का त्याग करना होगा।

कुछ तीन OS के पार OpenGL का उपयोग कर सकते हैं, क्योंकि यह कम से कम सामान्य भाजक प्रतीत होता है। सब अच्छा है। फिर, आपको अपने ग्राफिक्स एपीआई बैकेंड को निनटेंडो के जीएक्स पर पोर्ट करना होगा, आपको एक PS3 और Xbox360 पथ बनाना होगा।

आप क्या करते हैं? क्या आप अपने स्वयं के एपीआई को डिजाइन करते हैं जो अपने आप में कम से कम सामान्य भाजक है और प्रत्येक मंच के लिए इसके लिए बैकएंड कार्यान्वयन लिखता है या क्या आप प्रत्येक मंच के लिए लिखते हैं जो इसकी अपनी शाखा है?

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

जवाबों:


9

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

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

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

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


3
मुझे लगता है कि आपने वही कहा जो मैं कहना चाह रहा था, केवल बेहतर।
एशेल्ली

6

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

रूनिक गेम्स की मशाल की रोशनी ओगरे का उपयोग करते हुए लिखी गई थी और मैंने मैक और पीसी पर खेला है और यह दोनों पर बहुत अच्छा चलता है।


2
Ogre दृष्टिकोण के लिए +1। मुझे इसके बारे में पता है, कुछ कोड के माध्यम से पढ़ा है। मैं दृष्टिकोण के बारे में व्यक्तिगत कहानियों को सुनने के लिए अधिक इच्छुक था, हालांकि उस स्थिति में अन्य लोग क्या करते हैं।
मुख्य-फ़्रेम

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

हाँ! मैं वास्तव में अपने स्वयं के क्रॉस-एपीआई आवरण को रोल करते हुए थक गया था, और फिर मैंने ओग्रे का उपयोग करना शुरू कर दिया। पीछे मुड़कर नहीं देखा। :)
जैकोमो ०

1

मैंने ग्राफिक्स के लिए ऐसा नहीं किया है, लेकिन मैंने एक क्रॉस-प्लेटफॉर्म ऑडियो टूलकिट (पीसी / एक्सबीओएक्स / पीएस 2) बनाया है। हम कम से कम सामान्य-भाजक क्षमता के साथ-साथ वैकल्पिक प्लेटफ़ॉर्म-विशिष्ट क्षमताओं के साथ अपना स्वयं का एपीआई बनाने के मार्ग पर चले गए। यहां कुछ सबक सीखे गए हैं:

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

ऑडियो के लिए, चेन कुछ इस तरह थी SoundSources -> [Decoders] -> Buffers -> [3D Positioner] ->[Effects] -> Players

ग्राफिक्स के लिए, यह हो सकता है Model -> Shapes -> Positioner -> Texturer -> [Lighting] -> [Particle Effects] -> Renderer(यह शायद एक पूरी तरह से गलत सेट है, मैं एक ग्राफिक्स आदमी नहीं हूं)।

फ्रंट-एंड एपीआई लिखें जो आपकी मुख्य वस्तुओं को संभालता है, और एक प्लेटफ़ॉर्म-विशिष्ट बैक एंड जो एपीआई को निम्न-स्तरीय क्षमताओं के लिए मैप करता है। प्रत्येक क्षमता के लिए एक सर्वोत्तम प्रयास प्रदान करें। उदाहरण के लिए, PC और XBOX पर साउंड चिप्स की HRTF क्षमताओं का उपयोग करके 3D ऑडियो पोजीशनिंग की गई थी, जबकि PS2 एक साधारण पैन और फीका का उपयोग करता था। एक ग्राफिक्स इंजन प्रकाश व्यवस्था के साथ कुछ ऐसा ही कर सकता है।

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

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

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


0

मैं एक खुला स्रोत खेल इंजन लिख रहा हूं जिसे मोबाइल प्लेटफार्मों (विंडोज मोबाइल, एंड्रॉइड) के लिए योगहर्टगैम कहा जाता है। यह मेरी बहुत बड़ी समस्याओं में से एक थी। पहले मैंने इसे इस तरह हल किया:

class RenderMethod
{

public:

  virtual bool Init();
  virtual bool Tick();
  virtual bool Render();

  virtual void* GetSomeData(); 

}

आप हाजिर थे void*? ऐसा इसलिए है क्योंकि RenderMethodDirectDrawएक वर्टीकल RenderMethodDirect3Dपूल रिटर्न करते समय डायरेक्टड्रा सतह मिलती है । बाकी सब कुछ भी अलग हो गया था। मेरे पास एक Spriteवर्ग था जिसमें एक SpriteDirectDrawसूचक या एक SpriteDirect3Dसूचक था। यह एक प्रकार का चूसा हुआ।

इसलिए हाल ही में, मैं चीजों को फिर से लिख रहा हूं। मेरे पास अब क्या है एक RenderMethodDirectDraw.dllऔर एक है RenderMethodDirect3D.dll। आप वास्तव में, Direct3D का उपयोग करने की कोशिश कर सकते हैं, विफल हो सकते हैं, और इसके बजाय DirectDraw का उपयोग कर सकते हैं। ऐसा इसलिए है क्योंकि API समान रहता है।

यदि आप स्प्राइट बनाना चाहते हैं, तो आप इसे सीधे नहीं बल्कि एक कारखाने के माध्यम से करते हैं। कारखाना फिर डीएलएल में सही फ़ंक्शन को कॉल करता है और इसे माता-पिता में परिवर्तित करता है।

तो, यह RenderMethodएपीआई में है:

virtual Sprite* CreateSprite(const char* a_Name) = 0;

और यह परिभाषा है RenderMethodDirectDraw:

Sprite* RenderMethodDirectDraw::CreateSprite(const char* a_Name)
{
    bool found = false;
    uint32 i;
    for (i = 0; i < m_SpriteDataFilled; i++)
    {
        if (!strcmp(m_SpriteData[i].name, a_Name))
        {
            found = true;
            break;
        }
    }

    if (!found) 
    {
        ERROR_EXPLAIN("Could not find sprite named '%s'", a_Name);
        return NULL; 
    }

    if (m_SpriteList[m_SpriteTotal]) { delete m_SpriteList[m_SpriteTotal]; }
    m_SpriteList[m_SpriteTotal] = new SpriteDirectDraw();

    ((SpriteDirectDraw*)m_SpriteList[m_SpriteTotal])->SetData(&m_SpriteData[i]);

    return (m_SpriteList[m_SpriteTotal++]);
}

मुझे लगता है कि इसका मतलब बनता है। :)

PS मुझे इसके लिए STL का उपयोग करना पसंद था, लेकिन Android पर इसका कोई समर्थन नहीं है। :(

मूल रूप से:

  • हर रेंडर को अपने संदर्भ में रखें। या तो एक DLL, या एक स्थिर पुस्तकालय या सिर्फ हेडर का एक गुच्छा। जब तक आपके पास एक RenderMethodX, SpriteX और StuffX your सुनहरा है।
  • ओग्रे स्रोत से जितना संभव हो उतना चोरी करें।

संपादित करें: हाँ यह इस तरह आभासी इंटरफेस है समझ में आता है। यदि आपका पहला प्रयास विफल हो जाता है, तो आप एक और रेंडर विधि की कोशिश कर सकते हैं। इस तरह आप अपने सभी कोड रेंडर मेथड अज्ञेय रख सकते हैं।


1
क्या यह वास्तव में एक आभासी इंटरफ़ेस है यदि आप एक ही समय में एक से अधिक कार्यान्वयन सक्रिय नहीं होने जा रहे हैं, तो इसका मतलब है?
नॉर्थर्नड्रेगन

0

मुझे इसके लिए एसडीएल का उपयोग करना पसंद है । यह D3D, OpenGl, OpenGL ES, और मुट्ठी भर अन्य प्लेटफ़ॉर्म-विशिष्ट बैकेंड के लिए रेंडरर बैकएंड मिला है, और यह सभी विभिन्न प्लेटफार्मों के लिए उपलब्ध है, और वर्तमान में सक्रिय विकास के तहत, कई अलग-अलग भाषाओं में बाइंडिंग के साथ उपलब्ध है।

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

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