सी # जैसी प्रबंधित भाषा के साथ पीसी के लिए गेम लिखते समय आपको क्या नुकसान हुआ और आपने उन्हें कैसे हल किया?
सी # जैसी प्रबंधित भाषा के साथ पीसी के लिए गेम लिखते समय आपको क्या नुकसान हुआ और आपने उन्हें कैसे हल किया?
जवाबों:
मैं जावा के बारे में ज्यादा नहीं जानता, इसलिए यह एक शुद्ध देवता के दृष्टिकोण से है।
अब तक का सबसे बड़ा कचरा है। खिड़कियों पर .net कचरा संग्रहकर्ता एक शानदार काम करता है, और आप इसे सबसे अधिक भाग के बिना बैठे बच्चे से दूर कर सकते हैं। Xbox / winPhone7 पर यह एक अलग मामला है। यदि आपको हर कुछ फ्रेम में स्टॉल मिलते हैं, तो कचरा संग्रह आपको समस्याएं पैदा कर सकता है। फिलहाल यह हर 1mb आवंटन के बाद ट्रिगर होता है।
कचरा से निपटने के लिए कुछ सुझाव। आपको वास्तविकता में इनमें से अधिकांश के बारे में चिंता नहीं करनी चाहिए, लेकिन वे एक दिन काम में आ सकते हैं।
GC.GetTotalMemory()
स्क्रीन की सामग्री को ड्रा करें । यह आपको आवंटित बाइट्स की मात्रा का एक अनुमान देता है जो आपके खेल का उपयोग करता है। यदि यह मुश्किल से चलता है, तो आप ठीक कर रहे हैं। यदि यह तेजी से बढ़ रहा है, तो आपके पास मुद्दे हैं।GC.Collect()
हर फ्रेम को कॉल न करें । यह एक अच्छा विचार की तरह लग सकता है, अपने कचरे के ऊपर और उस सब पर, लेकिन कचरे के संग्रह से भी बदतर के साथ एकमात्र याद रखें कि कचरा संग्रह खत्म हो गया है।StringBuilder
(खबरदार, StringBuilder
एक जादू की गोली नहीं है, और अभी भी आवंटन हो सकता है! इसका मतलब है कि एक स्ट्रिंग के अंत में एक नंबर जोड़ने की तरह सरल संचालन, आश्चर्यजनक मात्रा में कचरा पैदा कर सकता है) या इंटरफ़ेस का foreach
उपयोग करने वाले संग्रह पर लूप का उपयोग करना, IEnumerable
आप को जानने के बिना भी कचरा पैदा कर सकते हैं (उदाहरण के लिए, foreach (EffectPass pass in effect.CurrentTechnique.Passes)
एक आम है)IDisposable
उन कक्षाओं पर उपयोग करना याद रखें जिनमें अप्रबंधित संसाधन हैं। आप मेमोरी को साफ करने के लिए इनका उपयोग कर सकते हैं, जीसी स्वयं को मुक्त नहीं कर सकता है।दूसरी बात यह है कि फ्लोटिंग पॉइंट परफॉर्मेंस। जबकि .Net JITer प्रोसेसर-विशिष्ट ऑप्टिमाइज़ेशन की एक उचित मात्रा में करता है, यह आपके फ़्लोटिंग पॉइंट मैथ्स को गति देने के लिए SSE या किसी अन्य SIMD निर्देश सेट का उपयोग नहीं कर सकता है। यह गेम के लिए C ++ और C # के बीच काफी बड़ा अंतर पैदा कर सकता है। यदि आपके मोनो का उपयोग कर रहे हैं, तो उनके पास कुछ विशेष SIMD गणित पुस्तकालय हैं जिनका आप लाभ उठा सकते हैं।
एक विशिष्ट प्रदर्शन नुकसान खेल के डिजाइन / विकास में कचरा कलेक्टर पर विचार नहीं कर रहा है। बहुत अधिक कचरा पैदा करने से खेल में "हिचकी" आ सकती है, जो तब होता है जब जीसी काफी लंबे समय तक चलता है।
C # के लिए, मान ऑब्जेक्ट का उपयोग करना और "स्टेटमेंट" का उपयोग करना GC से दबाव को कम कर सकता है।
using
बयान कचरा संग्रहण के साथ कोई संबंध नहीं है! यह उन IDisposable
वस्तुओं के लिए है - जो अप्रबंधित संसाधनों को जारी करने के लिए हैं (अर्थात: जिन्हें कचरा कलेक्टर द्वारा संभाला नहीं जाता है )।
मैं कहूंगा कि सी # में गेम लिखने में मुझे सबसे बड़ी समस्या सभ्य पुस्तकालयों की कमी की है। मैंने पाया है कि या तो सीधे पोर्ट हैं, लेकिन अपूर्ण हैं, या सी ++ लाइब्रेरी के ऊपर रैपर हैं जो मार्शलिंग के लिए भारी प्रदर्शन का जुर्माना लगाते हैं। (मैं OGRE लाइब्रेरी के लिए विशेष रूप से MOgre और Axiom के बारे में बोल रहा हूं, और Bullet भौतिकी लाइब्रेरी के लिए BulletSharp)
प्रबंधित भाषाएं (व्याख्या के अनुसार अलग-अलग हैं - न तो जावा और न ही सी # वास्तव में अब और व्याख्या की जाती हैं) देशी भाषाओं की तरह ही तेज़ हो सकती हैं यदि आपके पास वास्तव में धीमी गति से होने वाली (मार्शलिंग, कचरा संग्रह) की अच्छी समझ है। मुझे लगता है कि वास्तविक समस्या यह है कि लाइब्रेरी डेवलपर्स को अभी तक इसका एहसास नहीं हुआ है।
जैसा कि दूसरों ने कहा है, जीसी कलेक्शन पॉज़ सबसे बड़ा मुद्दा है। ऑब्जेक्ट पूल का उपयोग करना एक विशिष्ट समाधान है।
C # और Java की व्याख्या नहीं की गई है। वे एक मध्यवर्ती बायोटेक पर संकलित किए जाते हैं, जो JIT के बाद , मूल कोड के समान तेज़ हो जाता है (या पास पर्याप्त नहीं होता है)
मैंने पाया सबसे बड़ा नुकसान उन संसाधनों को मुक्त करना है जो सीधे उपयोगकर्ता के अनुभव को प्रभावित करते हैं। ये भाषाएँ स्वचालित रूप से नियतात्मक अंतिमकरण का समर्थन नहीं करती हैं जैसे कि C ++ करता है, यदि आप उम्मीद नहीं कर रहे हैं कि इससे आपको लगता है कि वे नष्ट हो जाने के बाद दृश्य के बारे में फ़्लोटिंग जैसी चीज़ों को जन्म दे सकते हैं। (C # IDis प्रयोज्य के माध्यम से निर्धारक अंतिम रूप देता है , मुझे यकीन नहीं है कि जावा क्या करता है।)
इसके अलावा, प्रबंधित भाषाएं वास्तव में उस तरह के प्रदर्शन को संभालने के लिए बहुत अधिक सक्षम हैं जिन्हें गेम के लिए क्रेडिट की आवश्यकता होती है। लिखित रूप से प्रबंधित कोड खराब लिखे गए देशी कोड की तुलना में बहुत तेज है।
IDisposable
समय-महत्वपूर्ण और अप्रबंधित संसाधनों के निर्धारक सफाई की अनुमति देता है, लेकिन अंतिम रूप देने या कचरा संग्रहकर्ता को सीधे प्रभावित नहीं करता है।
न तो जावा और न ही C # की व्याख्या की जाती है। दोनों को देशी मशीन कोड में संकलित किया जाता है।
उन दोनों और खेलों के साथ सबसे बड़ी समस्या इस तरह से कोड करना है कि वे खेल खेलने के दौरान कभी भी कचरा इकट्ठा नहीं करते हैं। हुप्स की संख्या के माध्यम से कूदने के लिए कि लगभग पहली जगह में उन्हें का उपयोग करने के लाभ पल्ला झुकना है। एप्लिकेशन या सर्वर प्रोग्रामिंग के लिए उपयोग करने के लिए उन भाषा को मज़ेदार बनाने वाली अधिकांश विशेषताओं को गेम प्रोग्रामिंग के लिए टाला जाना चाहिए अन्यथा आपको गेम खेलने के दौरान लंबे समय तक रुकना पड़ेगा क्योंकि वे बंद हो जाते हैं और कचरा इकट्ठा करते हैं।
एक बड़ी गड़बड़ी मैं इन जैसी भाषाओं के साथ खेल बनाने से देखता हूं (या XNA, टॉर्कएक्स इंजन इत्यादि जैसे उपकरणों का उपयोग करके) यह है कि आपको एक समान खेल बनाने के लिए आवश्यक विशेषज्ञता वाले अच्छे लोगों की टीम ढूंढने के लिए कड़ी मेहनत करनी होगी C ++ और OpenGL / DirectX में लोगों को ढूंढना काफी आसान होगा।
खेल देव उद्योग अभी भी C ++ में बहुत अधिक भारी है, क्योंकि अधिकांश उपकरण और पाइपलाइन का उपयोग बड़े या बस पॉलिश किए गए छोटे खेलों को C ++ में करने के लिए किया जाता है, और जहाँ तक मुझे पता है आप सभी आधिकारिक देव किट के बारे में जान सकते हैं। XBox, PS3, और Wii के लिए केवल C ++ के लिए संगतता के साथ जारी किया जाता है (XBox टूलसेट को आजकल अधिक प्रबंधित किया जा सकता है, किसी को अधिक पता है?)
यदि आप अभी कंसोल के लिए गेम विकसित करना चाहते हैं, तो आपको एक्सएनएक्सएक्स पर XNA और C # बहुत मिलता है और उसके बाद गेम लाइब्रेरी के केवल एक हिस्से में XBox लाइव इंडी गेम्स कहा जाता है। प्रतियोगिता जीतने वाले कुछ लोग अपने गेम को वास्तविक एक्सबॉक्स लाइव आर्केड में पोर्ट करने के लिए चुने जाते हैं। पीसी के लिए एक गेम बनाने पर उस योजना के अलावा अन्य।