2013-07-05 12 views
11

यूनिटी 3 डी Profiler मुझे स्पाइक्स देता है जो ज्यादातर कचरा संग्रह के बारे में है। नीचे दिए गए स्क्रीनशॉट में, तीन लाल स्पाइक्स मेरे गेमप्ले में तीन स्टालों का प्रतिनिधित्व करते हैं। इनमें से प्रत्येक स्टालों 100 + एमएस हैं और अधिकांश समय TrackDependencies पर खर्च किया गया था।यूनिटी 3 डी: कचरा संग्रह अनुकूलित करें

if (Time.frameCount % 30 == 0) 
{ 
    System.GC.Collect(); 
} 

यह मदद नहीं की:

Unity instruction के अनुसार, मैं अपने कोड को यह जोड़ने की कोशिश की। मेरे पास अभी भी स्पाइक्स हैं और वे अभी भी 100 + एमएस लेते हैं। वास्तव में क्या चल रहा है और मैं अपने गेम को अनुकूलित करने के लिए क्या कर सकता हूं?

पुनश्च:

मैं गतिशील बनाने रहा हूँ और मेरी खेल में GameObject रों का एक बहुत नष्ट करने। क्या यह एक समस्या हो सकती है?

मेरे पास लूप या सरणी में स्ट्रिंग कॉन्सटेनेशन नहीं है क्योंकि the post में गुफा के रूप में वापसी मूल्य है।

profiler

+0

क्या आप अपने कोड में कहीं वस्तुओं को नष्ट कर रहे हैं? – Heisenbug

+0

यदि संभव हो, अत्यधिक विनाश से बचने के लिए अपनी वस्तुओं को पूल करना एक अच्छा समाधान हो सकता है। – SlxS

+0

@ हेइसेनबग हां मैं गतिशील रूप से अपने खेल में बहुत सारी वस्तुओं को बना रहा हूं और नष्ट कर रहा हूं। मेरे नष्ट ऑब्जेक्ट फ़ंक्शन में मैंने 'Resources.UnloadUnusedAssets();' भी कहा – CherryQu

उत्तर

12

यह मदद नहीं की। मेरे पास अभी भी स्पाइक्स हैं और वे अभी भी 100 + एमएस लेते हैं। क्या बिल्कुल चल रहा है और मैं अपने गेम को अनुकूलित करने के लिए क्या कर सकता हूं?

System.GC.Collect के साथ आप बस कचरा संग्रह को मजबूर कर रहे हैं। यदि आपने पिछले संग्रह से हटाए जाने के लिए बहुत सारी मेमोरी आवंटित की है, तो आप स्पाइक्स से बच नहीं सकते हैं। बड़े पैमाने पर डीलोकेशन से बचने के समय कचरे के संग्रह को वितरित करने का प्रयास करने के लिए यह केवल उपयोगी है।

मैं अपने गेम में बहुत से गेम ऑब्जेक्ट्स को गतिशील रूप से बना रहा हूं और नष्ट कर रहा हूं। क्या यह एक समस्या हो सकती है?

शायद यह समस्या हो सकती है।

कुछ संकेत: आवंटित करने के लिए

  • कोशिश (LoadResource और Instantiate) पर अपने संसाधनों का जितना संभव हो उतना आप आवेदन के शुरू करते हैं। यदि आवश्यक स्मृति बहुत अधिक नहीं है, तो आप बस आवश्यक सभी संसाधनों को तुरंत चालू कर सकते हैं और मांग पर अक्षम/सक्षम कर सकते हैं। यदि संसाधन स्मृति आवश्यकताएं बहुत बड़ी हैं तो यह प्राप्त नहीं हो सकती है।
  • Instantiate और Destroy पर कॉल करने से बचें। ऑब्जेक्ट का पूल बनाएं जहां एप्लिकेशन शुरू होने पर संसाधनों का एक सेट तत्काल हो। आपको आवश्यक संसाधनों को सक्षम करें, और बाकी सभी को अक्षम करें। ऑब्जेक्ट को नष्ट करने के बजाय इसे पूल में छोड़ दें, ताकि इसे अक्षम किया जा सके और मांग पर पुन: सक्षम किया जा सके।
  • Resources.UnloadUnusedAssets पर कॉल करने से बचें। यह केवल एक नया संसाधन इंस्टेंट करने के लिए आवश्यक समय बढ़ा सकता है यदि आपने इसे पहले रिलीज़ किया है। यह स्मृति उपयोग का चयन करने के लिए उपयोगी है, लेकिन इसे लागतत्मक अंतराल पर कॉल करना या हर बार जब आप किसी ऑब्जेक्ट को नष्ट करते हैं तो इसका कोई मतलब नहीं होता है।
संबंधित मुद्दे