2012-08-12 15 views
7

इसलिए मैं अपने पीसी गेम को Xbox 360 पर काम करने के लिए परिवर्तित करना चाहता था। यह इंटेल कोर 2 क्वाड @ 2.40 गीगा और एक राडेन 4850 के साथ पीसी पर बहुत अच्छा जुड़ा हुआ था 512MB।पीसी एक्सएनए गेम Xbox 360 में परिवर्तित - विशाल प्रदर्शन मुद्दे

मैंने इसे Xbox में पोर्ट किया, और बल्ले से बाहर, सूचियों के आयात के संबंध में आविष्कार और विरासत के साथ कुछ समस्या थी, इसलिए मैंने बस LINQ विधि का उपयोग किया .Cast <>()।

अगर ऐसा तरीका है एक बड़ा भूमि के ऊपर ले जाता है, मुझे पता है, क्योंकि मैं किसी कारण से 360 पर प्रदर्शन का विश्लेषण तैनात नहीं कर सकते, सबसे अधिक संभावना है, क्योंकि यह 360

पर खेलता जाने फिर एक और समस्या आया, और यह एक अच्छी प्रणाली थी। OutOfMemoryException। मेरे स्काईबॉक्स बनावट 4096x4096 थे, इसलिए उन्हें आधे से कम करने से उस त्रुटि को हटा दिया गया। हालांकि, वे केवल 3 एमबी x 6 थे, इसलिए यह 512 एमबी उपलब्ध अधिकांश का उपयोग नहीं करना चाहिए।

तो जब उन सभी समस्याओं को रास्ते से साफ़ कर दिया गया, तो 2 सेकंड प्रति अच्छा 1 फ्रेम पेश किया गया। यह गेमप्ले के 1 मिनट के बाद दुर्घटनाग्रस्त हो जाता है, जिसका अर्थ है "कोड 4"।

यह एक पावरपॉइंट की तरह खेलता है। पीसी गेमप्ले से कुछ प्रदर्शन विश्लेषण छवियां यहां दी गई हैं। वे बुरे नहीं हैं।

सीपीयू: http://i.imgur.com/JYx7Z.png रैम: http://i.imgur.com/C29KN.png और 72% = 150 एमबी आपको दिमाग में रखता है।

मुझे आशा है कि यहां किसी को भी इस मुद्दे पर कुछ अनुभव होगा। सच में मैं सभी कान हूँ।

उत्तर

11

आपकी प्रदर्शन समस्याओं का मूल कारण लगभग निश्चित रूप से है क्योंकि आप अपना गेम चलते समय स्मृति आवंटित कर रहे हैं (स्टार्टअप के बाद, Draw/Update पाश के दौरान)।

विंडोज़ पर यह ठीक है। विंडोज पर कचरा कलेक्टर पीरियनल है (जब संभव हो तो केवल नई वस्तुओं को साफ करेगा) और बेहद तेज़। यह चालाक है जब यह भी चलाने के लिए चुनता है।

दूसरी ओर, Xbox 360 पर कचरा कलेक्टर पूरी तरह से बकवास है। यह आवंटित हर 1 एमबी स्मृति के लिए चलता है। जब यह चलता है तो यह पूरे प्रबंधित ढेर की जांच करता है। और बूट करने में काफी धीमा है।

तो इसका जवाब स्मृति को आवंटित नहीं करना है जबकि आपका गेम इसकी चल रही स्थिति में है।

इस here के बारे में एक अच्छा ब्लॉग पोस्ट है। (यह भी विकल्प का वर्णन करता है कभी नहीं स्मृति आवंटन के लिए - ढेर जटिलता को कम करने के लिए है जो - जो लागू करने के लिए वास्तव में बहुत मुश्किल है और मैं इसकी सलाह नहीं देते।)

  • आप के रूप में LINQ जैसी चीजों को हटाने के लिए, होगा क्वेरी ऑब्जेक्ट्स बनाता है जो ढेर ऑब्जेक्ट्स हैं, जैसा प्रतिनिधि अक्सर इसकी आवश्यकता होती है। इसके बजाए सरल लूप का प्रयोग करें।
  • यदि आप ड्रा/अपडेट में अपने स्वयं के संदर्भ प्रकार आवंटित कर रहे हैं, तो आपको संभवतः मूल्य प्रकारों का उपयोग करके परिवर्तित करना होगा या ऑब्जेक्ट पूलिंग जोड़ना होगा।
  • string ऑब्जेक्ट्स बनाना स्मृति आवंटन का एक और आम स्रोत है - इसके बजाय आप StringBuilder का पुन: उपयोग कर सकते हैं और इसे सीधे प्रस्तुत कर सकते हैं।
  • StringBuilder के लिए यहां तक ​​कि StringBuilder के लिए चीजों को परिवर्तित करना (विशेष रूप से: संख्याएं) को परिवर्तित करना होगा। आपको आवंटन मुक्त विकल्पों को लिखना/ढूंढना होगा।My answer to this similar question में int के लिए एक है।

निदान करने के लिए जहाँ आप स्मृति का आवंटन कर रहे हैं सबसे अच्छा तरीका है CLR Profiler विंडोज पर के साथ अपने खेल को चलाने के लिए है। यह आपको बताएगा कि स्मृति कहां और कब आवंटित की जा रही है। बस जब तक आप आवंटित नहीं कर रहे हैं अनुकूलित करें।

(या जब तक आप विश्वसनीय रूप से 1 एमबी प्रति स्तर/मानचित्र/कमरे/जो कुछ भी भरोसेमंद आवंटित नहीं कर रहे हैं, और एक ऐसे समय के दौरान मैन्युअल जीसी करें जहां यह स्टटर के लिए उचित है - एक स्थिर लोडिंग स्क्रीन या फीका-टू-ब्लैक ।)

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

अंततः: शायद संकुचित आपके बनावट का आकार (पीएनजी या जेपीईजी या इसी तरह का उपयोग करके) है। यदि आपके बनावट असंपीड़ित हैं, 4096 × 4096 × 6 × 4 बाइट्स = 384 एमबी। यह बहुत बड़ा है - कोई आश्चर्य नहीं कि आप स्मृति से बाहर भाग गए हैं। आप उन्हें DXT1 के साथ संपीड़ित कर सकते हैं और उन्हें 6 गुना छोटा कर सकते हैं (instructions, wiki)। आप उनके संकल्प को भी कम कर सकते हैं। और क्या आपको नीचे का चेहरा चाहिए?

+1

धन्यवाद एक गुच्छा, खोज का एक बहुत बाद मैं मिलती-जुलती जवाब मिल गया, और जब मैं अपने CLR प्रोफ़ाइल भागा मैंने पाया कि मैं फ्रेम प्रति 60MB के आसपास का आवंटन किया गया था ... अच्छा नहीं। ऐसा इसलिए है क्योंकि मैं अपने गेम में सभी टकराव योग्य वस्तुओं को एक सूची में जोड़ता हूं, और फिर उन्हें प्रत्येक फ्रेम को टकराव थ्रेड में फेंक देता हूं। मैं इसे एक स्थिर सूची बना सकता हूं, जहां यह सिर्फ एक संदर्भ है, जो मैं शायद करूँगा, लेकिन फिर मुझे टकराव की संभावना है। लेकिन मुझे लगता है कि यह एकमात्र विकल्प है। –