मैं कस्टम इंजन का उपयोग करके कई प्लेटफार्मों पर कैसे चला सकता हूं?


13

यूनिटी और अनार्यल जैसे गेम इंजन म्यूटेंट प्लेटफार्मों पर चल सकते हैं। मैं सोच रहा हूं कि वे ऐसा कैसे करते हैं।

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

जवाबों:


26

प्रत्येक प्लेटफ़ॉर्म पर अपना इंजन पोर्ट करें। इसके बारे में कुछ खास नहीं है। यदि आपके पास कुछ कोड है जो केवल Windows है, तो या तो फ़ाइल में कुछ #ifdef तर्क जोड़ें या एक दूसरी फ़ाइल जोड़ें (ताकि आपके पास FooWindows.cppऔर FooLinux.cppजो भी हो) जो अन्य OS पर उस सुविधा को लागू करता है ( ।

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

अन्य इंजन बिल्ड सिस्टम और क्रॉस-कंपाइलर पर भरोसा करते हैं, जब जरूरत हो तो संकलित गेम बनाने के लिए, जैसे आप किसी भी गैर-गेम क्रॉस-प्लेटफॉर्म एप्लिकेशन के साथ करेंगे।

HTML5 जैसी चीजों के लिए, emscripten जैसे उपकरण हैं जो जावास्क्रिप्ट में चलने के लिए C ++ एप्लिकेशन को संकलित कर सकते हैं। आपको मूल रूप से केवल emscripten के लिए अपने इंजन का एक और पोर्ट बनाने की आवश्यकता है (क्योंकि यह किसी भी मनमाने ढंग से C ++ पुस्तकालय / सुविधा का उपयोग नहीं कर सकता है)।

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


14
मेरे अनुभव में क्रॉसप्लेट रिकॉर्डर सॉफ्टवेयर (सबसे बड़ी परियोजना हॉटस्पॉट होगी) के साथ काम करते हुए आप वास्तव में कोड के माध्यम से फेंके गए इफ्स से बचना चाहते हैं। यह निश्चित रूप से बेहतर है कि कुछ share/os/<linux>(या share/cpu/x86) की तरह है और सभी प्लेटफ़ॉर्म विशिष्ट कोड को वहां रखा जाए और फिर सशर्त शामिल करें। यह कम से कम क्या gcc, हॉटस्पॉट और लिनक्स कर्नेल करते हैं (निश्चित रूप से एक कठिन नियम नहीं)। हाँ, आप केवल एक ही फ़ंक्शन के साथ शुरू कर सकते हैं जो प्लेटफ़ॉर्म पर निर्भर है और लगता है कि यह ओवरकिल है लेकिन यह कभी भी इस तरह नहीं रहता है और यह जल्दी से एक गड़बड़ हो जाता है।
वू जूल

14

यहां कोई मैजिक बुलेट नहीं है। यदि आप चाहते हैं कि आपका गेम कई प्लेटफार्मों पर चले, तो आपको कई प्लेटफार्मों के लिए कोड लिखना होगा (या तीसरे पक्ष के पुस्तकालयों का लाभ उठाना होगा जो पहले से ही आपके लिए ऐसा करते हैं)।

जिन चीजों के लिए आप पूछ रहे हैं, वे संरेखित न करें: आप कहते हैं (जोर मेरा)

मैं जिस चीज की तलाश कर रहा हूं वह कुछ को एकीकृत करने के लिए संसाधन है जो मुझे बिना पुनर्लेखन के विभिन्न प्लेटफार्मों पर चलाने की अनुमति देगा

लेकिन यह भी (फिर से मेरा जोर)

मुझे पता है कि मैं अपने लिखने के बजाय दूसरे इंजन का उपयोग कर सकता हूं लेकिन मुझे सीखने के अनुभव में दिलचस्पी है

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

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


2

अन्य दो उत्तरों के विपरीत (जो कि सी ++ विशिष्ट हैं), एक और तरीका है। कुछ आर्किटेक्चर जो दिमाग में आते हैं:

  • अपने इंजन को पोर्ट करें: कोड को संशोधित करें या लिखें ताकि यह कई प्लेटफार्मों पर काम करे। यह ऊपर दिए गए उत्तरों में संबोधित किया गया है।
  • क्रॉस-प्लेटफॉर्म लाइब्रेरी के ऊपर कुछ लिखें: यह libGDX का उदाहरण है, जो जावा पर चलता है। जावा डेस्कटॉप, एंड्रॉइड और आईओएस (रोबो वीएम के माध्यम से) पर चलता है। जावा जैसी किसी चीज़ का उपयोग करके, आपको निशुल्क अतिरिक्त प्लेटफ़ॉर्म का लाभ मिलता है जब अंतर्निहित लाइब्रेरी / उपकरण उनका समर्थन करता है। इस मामले में, जब रोबो वीएम बाहर आया, तो आईओएस पर libGDX (लगभग) "बस काम करता है"।
  • एक कोड जनरेटर लिखें: यह हेक्स और अन्य उपकरणों का दृष्टिकोण है। आपके पास एक मुख्य भाषा है (उदाहरण के लिए। Haxe / AS3), और आप ऐसे कन्वर्टर्स लिखते हैं जो अन्य भाषाओं के लिए आउटपुट उत्पन्न करते हैं। उदाहरण के लिए। Haxe डेस्कटॉप के लिए C ++ में कनवर्ट होता है, Android के लिए जावा (मुझे लगता है), आदि।

व्यक्तिगत रूप से, मुझे लगता है कि libGDX का दृष्टिकोण सबसे सरल है: एक भाषा या मंच खोजें जो आपकी आवश्यकताओं को पूरा करती है, और शीर्ष पर लिखें। कोड पीढ़ी और पोर्टेबल इंजन अच्छी तरह से लिखने के लिए जटिल और कठिन हैं।

libGDX वास्तव में एक बढ़िया विकल्प है, क्योंकि यह दोनों प्रमुख मोबाइल फोन, डेस्कटॉप और वेब (एप्लेट्स या Google के वेब बॉयलर के माध्यम से) को हिट करता है।


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

@JoshPetrie आपको अपने स्वयं के C ++ इंजन को रोल करने और प्लेटफार्मों में इसे पोर्ट करने की तुलना में निश्चित रूप से बहुत कुछ "मुफ्त में" मिलता है।
as999999

@ ashes999 उत्तर के लिए धन्यवाद, libGDX शानदार है मैं इसका उपयोग करता हूं, लेकिन मैं इसे लिखने जा रहा हूं इसलिए यह क्रॉस प्लेटफॉर्म का काम करता है, फिर सीएमके का उपयोग करें, मैं एक पूर्व मौजूदा पुस्तकालय या इंजन का उपयोग करने की तुलना में चुनौती के लिए इसमें अधिक हूं
डेनियलकोलियर

2

मैं इस समय एक क्रॉस-प्लेटफॉर्म गेम इंजन बना रहा हूं। मैं SDL का उपयोग कर रहा हूं, जो दर्द को कम करने के लिए ग्राफिक्स अनुप्रयोगों के निर्माण के लिए एक उत्कृष्ट (और उपयुक्त रूप से निम्न स्तर) क्रॉस-प्लेटफॉर्म लाइब्रेरी है।

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

मैं आपको #ifdefअपने कोड में हर जगह उपयोग करने से हतोत्साहित करता हूँ । इसके बजाय, प्रमुख प्राइमेटीज़ के आस-पास एब्स्ट्रैक्ट बनाएं (ऐसे प्राइमेट का उदाहरण टीसीपी सॉकेट हो सकता है)।

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


0

यदि आप इसे "स्क्रैच से" एक सीखने के अनुभव के रूप में करना चाहते हैं तो आपको Win32 API का उपयोग करने की आवश्यकता होगी जहां आप MSDN पर और OpenGL विकि पर एक OpenGL संदर्भ ( http: // www) खोलने के बारे में जानकारी पा सकते हैं .opengl.org / wiki / Create_an_OpenGL_Context_ (WGL) )। लिनक्स के लिए O'Reilly Xlib प्रोग्रामिंग मैनुअल और Xlib संदर्भ मैनुअल की दूसरी हाथ की प्रतिलिपि प्राप्त करें और GLX (X विंडो सिस्टम के लिए ओपन एक्सटेंशन) पर भी पढ़ें। Http://www.opengl.org/wiki/Tutorial:_OpenGL_3.0_Context_Creation_(GLX) भी देखें

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


उत्तर के लिए धन्यवाद, लेकिन मैं सिर्फ विंडो के लिए एसडीएल 2 का उपयोग करूंगा, इसका क्रॉस प्लेटफॉर्म और उपयोग करने में बहुत आसान। कितना LibGDX विंडोइंग के लिए LWJGL का उपयोग करता है
DanielCollier
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.