2011-01-07 14 views
5

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

थोड़ी देर के लिए अपने बालों को खींचने के बाद, मैंने देखा कि कचरा संग्रह (GC_FOR_MALLOC) कर रहे प्रक्रिया आईडी मेरी प्रक्रिया आईडी नहीं थीं। प्रोसेस आईडी "एंड्रॉइड सिस्टम" और android.process.acore से संबंधित थी (बाजार से "एंड्रॉइड सिस्टम इन्फो" ऐप का उपयोग करके निर्धारित)। Acore प्रक्रिया डिजिटल घड़ी नामक डेस्कटॉप विजेट से जुड़ा हुआ था। मैंने विजेट को अनइंस्टॉल किया और लगभग किसी भी विराम के बिना पूरे गेम के माध्यम से इसे बनाया। "एंड्रॉइड सिस्टम" के लिए जीसी के लिए एक बहुत ही संक्षिप्त विराम था।

लंबे विवरण के लिए क्षमा करें, लेकिन अब मेरे सवालों के लिए:

  1. कैसे यह है कि अन्य खेलों में कभी-कभी (डेवलपर के नियंत्रण से बाहर कुछ) सिस्टम प्रक्रिया के जी सी की वजह से रुक जाता है नहीं है?
  2. पहले प्रश्न की पंक्तियों के साथ, मैं जीसी के कारण एक अलग एप्लिकेशन से कैसे निपट सकता हूं जो मेरी प्रक्रिया को धीमा कर देता है और मेरे गेम में हिचकी का कारण बनता है?

मैं बस लगता है कि कुछ के बाद से अन्य खेलों इस समस्या नहीं है मुझे याद आ रही है की तरह।

धन्यवाद

+1

यदि आपका ऐप कि कचरा कलेक्टर के प्रति संवेदनशील है, आप गलत कर रहे हैं। – Falmarri

+0

गेम dev विशिष्ट प्रश्नों के लिए http://gamedev.stackexchange.com/ पर आपको बेहतर भाग्य हो सकता है। मुझे यकीन नहीं है कि इसका एक आसान जवाब है। आप जीसी को रोक नहीं सकते हैं, बस उन्हें कम करें। 2.3 समवर्ती जीसी शामिल है, लेकिन यदि आप पहले के प्लेटफॉर्म को लक्षित करना चाहते हैं तो इससे आपको बहुत मदद नहीं मिलती है। –

उत्तर

3

आप अपने खेल के फ्रेम दर में कमी कर सकते हैं? हो सकता है कि यह 100% सीपीयू का उपयोग कर रहा हो ताकि सीपीयू का उपभोग करने वाला कोई और चीज इसे अंतराल बनाने जा रहा है। ये डिवाइस आपके औसत पीसी जितना तेज़ नहीं हैं। फ्रेम दर को चिकनी होने के लिए पर्याप्त उच्च रखने के लिए आप प्रत्येक फ्रेम को बनाने के लिए आवश्यक CPU को कम करने पर भी देख सकते हैं।

+0

आपने इसे ठीक से खींचा। मेरा खेल 100% सीपीयू का उपयोग कर रहा था। इसे ठीक करने के लिए मैंने जो सबसे बड़ी चीज की थी वह बदल गई थी कि पारदर्शिता को संसाधित करने के लिए पृष्ठभूमि को कैसे खींचा गया था (नीचे कार्य करें)। मेरा सीपीयू तुरंत वहां से गिरा दिया गया। एक बार जब सीपीयू का पेग नहीं किया गया, तो मैंने कचरा संग्रह कभी नहीं देखा। thx – Steve0212

+0

पार्टी के लिए थोड़ा देर हो चुकी है, लेकिन मेरे पास एक समान समस्या है। प्रत्येक फ्रेम के अंत में बस सोने के अलावा, आप वास्तव में 100% से कम CPU का उपयोग कैसे करते हैं? और सीपीयू उपयोग को मापने के लिए आप किस उपकरण का उपयोग कर रहे हैं? साथ ही, पारदर्शिता नहीं है/वास्तव में एक GPU उपयोगकर्ता नहीं, पारदर्शी नहीं है? धन्यवाद! – Tenfour04

+0

@ TenFour04: लगभग परिभाषा के अनुसार, आप जितना संभव हो उतना कम काम करने के लिए सुनिश्चित करके कम CPU का उपयोग करते हैं। कभी-कभी इसका मतलब है कि एक अलग छवि प्रारूप का उपयोग करना (अल्फा महंगा है, विशेष रूप से यदि आपके पास एक क्रैपी जीपीयू है या कोई भी नहीं है), कभी-कभी इसका मतलब सामानों का संदर्भ संग्रहीत करना है ताकि आपको इसे हर बार देखना न पड़े ... कभी-कभी इसका मतलब यह है कि आप जानते हैं कि आपको ऐसा करने से पहले कुछ करना है। विनिर्देश भिन्न होते हैं, लेकिन यह सब "CPU चक्रों को बर्बाद न करें" तक उबाल जाता है। ओह, और सोना एक अच्छी बात है - अगर अच्छी तरह से किया जाता है, तो यह फ्रेम दर अपेक्षाकृत स्थिर रहता है। – cHao

0
private static Bitmap GetNonTransparentBitmap(int Id) { 
    // no transparency 
    Drawable tmp = myContext.getResources().getDrawable(Id); 

    Bitmap retval = Bitmap.createBitmap(tmp.getMinimumWidth(), tmp.getMinimumHeight(), Bitmap.Config.RGB_565); 
    Canvas canvas = new Canvas(retval); 
    tmp.setBounds(0, 0, tmp.getMinimumWidth(), tmp.getMinimumHeight()); 
    tmp.draw(canvas); 
    return retval; 
} 
संबंधित मुद्दे