मल्टी-प्लेटफ़ॉर्म मल्टी-थ्रेडिंग: वास्तविक चुनौतियाँ क्या हैं?


21

जबकि SDL जैसी लाइब्रेरी थ्रेडिंग के लिए एक क्रॉस-प्लेटफ़ॉर्म रैपर एपीआई प्रदान करती है, मुझे लगता है कि यह मान लेना भोला होगा कि इससे विभिन्न प्लेटफ़ॉर्म (डेस्कटॉप / मोबाइल) में सीधे गेम का आसान विकास होता है।

इस तरह से विकास करने का सबसे अच्छा तरीका क्या है (किसी भी क्रॉस-प्लेटफॉर्म थ्रेडिंग एपीआई को देखते हुए) निम्नलिखित पर विचार कर रहा है:

  • कोर की अलग संख्या
  • कोर प्रति काफी अलग प्रसंस्करण क्षमताओं
  • आम तौर पर विभिन्न प्रणालियों वास्तुकला जैसे। कैश, रैम और I / O एक्सेस के लिए अलग-अलग लेटेंसी

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

संपादित करें: कृपया अन्य लोग इस पर और अनुभव प्रदान कर सकते हैं क्योंकि मुझे नहीं लगता कि मेरे प्रश्न का पूरी तरह से उत्तर दिया गया है।


जैसा कि मेरा जवाब आपके प्रश्न का पूरी तरह से उत्तर नहीं देता है, क्या आप विस्तार कर सकते हैं कि क्या गायब है / आप क्या जानना चाहते हैं? मैं एक महान लेखक नहीं हो सकता, लेकिन मैंने इस तरह की समस्या को एक से अधिक बार संभाला है।
वलमंड

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

1
मुझे लगता है कि कठिनाई से आता है जो आप के लिए धागे का उपयोग करना चाहते हैं। यह एक बात है एक सहायक धागा है जो पक्ष पर कुछ कर रहा है, और 8-कोर मशीन से प्रदर्शन के अंतिम बिट्स को निचोड़ने की कोशिश करने के लिए पूरी तरह से एक और है .. जिस तरह से मैं इसे देखता हूं, एसडीएल धागे ज्यादातर पहले के लिए होते हैं, उत्तरार्द्ध नहीं।
जरी कोमप्पा

जवाबों:


11

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

जबकि SDL जैसी लाइब्रेरी थ्रेडिंग के लिए एक क्रॉस-प्लेटफ़ॉर्म रैपर एपीआई प्रदान करती है, मुझे लगता है कि यह मान लेना भोला होगा कि इससे विभिन्न प्लेटफ़ॉर्म (डेस्कटॉप / मोबाइल) में सीधे गेम का आसान विकास होता है।

खेल का आसान विकास - यकीन है। इष्टतम मल्टीथ्रेडिंग, नहीं। लेकिन आपको गेम बनाने के लिए मल्टीथ्रेडिंग की आवश्यकता नहीं है । उच्च प्रदर्शन वाले बनाने के लिए, यह निश्चित रूप से मदद करता है। लेकिन कई महान खेल एक ही धागे में चलते हैं।

इस तरह से विकास करने का सबसे अच्छा तरीका क्या है (किसी भी क्रॉस-प्लेटफॉर्म थ्रेडिंग एपीआई को देखते हुए) निम्नलिखित पर विचार कर रहा है:

  • कोर की अलग संख्या
  • कोर प्रति काफी अलग प्रसंस्करण क्षमताओं
  • आम तौर पर विभिन्न प्रणालियों वास्तुकला जैसे। कैश, रैम और I / O एक्सेस के लिए अलग-अलग लेटेंसी

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

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

कुछ और पढ़ने:

http://www.gamasutra.com/view/feature/1830/multithreaded_game_engine_.php - 'डेटा समानांतर' अनुभाग देखें। इस मॉडल के साथ डेटा को कई समान कार्यों में विभाजित किया गया है और अलग-अलग थ्रेड्स के लिए तैयार किया गया है।

http://software.intel.com/en-us/articles/designing-the-framework-of-a-parallel-game-engine/ - काफी घने, गेम स्तर के बजाय ओएस स्तर पर चीजों का वर्णन करता है।

http://drdobbs.com/high-performance-computing/216500409 - गेम विशिष्ट नहीं है, लेकिन आपको यह बताने के लिए पूरी तरह से प्रासंगिक है कि आपको कार्यों को कैसे विभाजित करने की आवश्यकता है।

http://www.itfgaming.com/news/tech-focus-crysis-2-and-the-future-of-cryengine-3 - इस साक्षात्कार के आधे-अधूरे तरीके के बारे में एक किस्सा है कि कैसे वे एक कार्य आधारित प्रणाली में चले गए। ।


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

क्षमा करें, मुझे लगा कि इस तरह का दृष्टिकोण सर्वविदित है। मैं जवाब में विस्तार से बताऊंगा।
काइलोटन

4

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

सबसे बड़ी समस्या थी (जो कि दूसरों के बीच मेरा काम था) उन प्लेटफार्मों को अलग करने और उन संस्करणों को निर्धारित करने और उन्हें बनाने का तरीका निर्धारित करने के लिए (यानी। बड़ी स्क्रीन) लेकिन लो प्रोफाइल बड़ी स्क्रीन / हाई प्रोफाइल का डाउनग्रेडेड संस्करण होना चाहिए या इसे होना चाहिए। मध्यम आकार की स्क्रीन / लो प्रोफाइल बड़ी स्क्रीन?)।

बेशक हम इसे ध्यान में रखते हुए कोडित थे, इसलिए गेम स्क्रीन आकार से बहुत कम जुड़े हुए थे।

HTH

[संपादित करें] मेरा क्या मतलब था कि आपको अपने लक्ष्य प्लेटफार्मों को अलग-अलग गुणों में विभाजित करने की आवश्यकता है (यानी १ कोर, २ कोर, १ कोर लेकिन दो बार उपवास ...) फिर तय करें कि आपको कितने आभासी लक्ष्य चाहिए (उदाहरण के लिए " केवल एक "या" लो, मिड, हाय ") फिर सभी प्लेटफार्मों को उनके संबंधित 'गुणवत्ता' में रखें और प्रत्येक गुणवत्ता के लिए, सबसे कम भाजक और 'पोर्ट' कोड को लें ताकि यह उन आवश्यकताओं (यानी काम करता है और तेज) का अनुपालन करता है। पर्याप्त)।

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


अपने सिर के ऊपर से, इस तरह के मल्टी-प्लेटफॉर्म रिलीज के लिए समायोजित करने के लिए आप कितना ओवरहेड समय कहेंगे कि परियोजना के डिजाइन और विकास दोनों चरणों में थे? बस एक मोटा औसत मदद करेगा।
इंजीनियर

1
ठीक है, जैसा कि हमने बहु भाषा (अंग्रेजी, फ्रेंच, स्पेनिश, पोर्टुगेसी, जर्मन और इतालवी एक पैक में + दिन, ताईवान, तुर्की, रूसी ... की जो भी भाषा की जरूरत थी) किया था और हमारे पास "पोर्ट" करने के लिए आवश्यक नए प्लेटफॉर्म थे। हमारे सभी खेल हर कुछ महीनों में (मोबाइल की एक नई कक्षा पढ़ें) हम वास्तव में इस तरह से नहीं जाने में बहुत समय खो देंगे, यह वास्तव में वास्तव में एक बड़े मंदिर के बिना असंभव होगा। 'फ्रेमवर्क' का डिज़ाइन रन पर किया गया था क्योंकि मैंने विभिन्न मोबाइलों के बारे में सीखा था और शायद 3-4 साल बाद परिपक्वता आई। हालांकि निवेश के लायक।
वलमंड

1

मुझे लगता है कि ऐसा करने का एकमात्र तरीका यह मूल्यांकन करना है कि आपके द्वारा समर्थन करने का इरादा रखने वाले प्रत्येक उपकरण के अनुसार कितने थ्रेड चल सकते हैं, और यह पता लगा सकते हैं कि सबसे कम सामान्य भाजक क्या है।

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

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

इस तरह से विकास करने का सबसे अच्छा तरीका क्या है (किसी भी क्रॉस-प्लेटफॉर्म थ्रेडिंग एपीआई को देखते हुए) निम्नलिखित पर विचार कर रहा है:

different numbers of cores
vastly different processing capabilities per core
A generally different systems architecture with eg. different

कैश, रैम और I / O एक्सेस के लिए विलंबता

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

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