2013-01-10 20 views
7

धीमा कर देती है मैं अपने ऐप में टुकड़ों के बीच स्वाइप करने के लिए एक व्यूपर का उपयोग कर रहा हूं। मैं एक्सएमएल में पृष्ठभूमि को परिभाषित करता हूं, इसलिएएंड्रॉइड पृष्ठभूमि छवि ऐप

android:background="@drawable/bg_final" 

यदि मैं एक साधारण पृष्ठभूमि रंग का उपयोग करता हूं, तो मेरा ऐप बहुत चिकनी काम करता है। अगर मैं इसे इस पृष्ठभूमि छवि के साथ उपयोग करता हूं, तो एफपीएस घटता है और मेरा ऐप केवल निष्क्रिय हो जाता है। यह धीमा नहीं है, बस इतना आसान नहीं है, हालांकि कमजोर उपकरणों पर यह काम कर सकता है। क्या पृष्ठभूमि छवि को लागू करने का यह एक बुरा तरीका है? पूरी छवि 14.7kb के आकार के साथ 480x800 पीएनजी है। क्या समस्या हो सकती है?

+0

आप पृष्ठभूमि छवि अपलोड किया जा सका हल बनायें? अगर वे काले रंग के रंग हैं, तो आप फ़ोटोशॉप का उपयोग करके उन्हें हटा सकते हैं और इसे अपनी एक्सएमएल फ़ाइल पर मैन्युअल रूप से जोड़ सकते हैं। या उस मामले के लिए कोई अन्य दोहराव रंग। –

उत्तर

1

इस का कारण यह है कि छवि बढ़ाया जा रहा है हो सकता है (टुकड़े की पृष्ठभूमि पारदर्शी होते हैं, viewpager एक main.xml जो इस छवि के साथ अपनी पृष्ठभूमि है में है), और एंड्रॉयड प्रदर्शन पृष्ठभूमि छवियों को खींचने के साथ मुद्दों।

इसके बजाय, आपको पृष्ठभूमि छवि को या तो पृष्ठभूमि रंग या see this answer के साथ प्रतिस्थापित करने के बजाय छवि दोहराने के लिए प्रतिस्थापित करना चाहिए।

9

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

public class DTImageView extends View { 

    public Bitmap imageBitmap; 

    public DTImageView(Context context) { 
     super(context); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     if(imageBitmap != null) 
      canvas.drawBitmap(imageBitmap, 0, 0, null); 
    } 
} 

एक prescaled बिटमैप का उपयोग कर कोड आह्वान: इस बिंदु पर

DTImageView bgImageView = new DTImageView(context); 
bgImageView.imageBitmap = Bitmap.createScaledBitmap(bitmap,width,height,true); 

आप जहां से वह संबंधित दृश्य पदानुक्रम को यह दृश्य जोड़ सकते हैं

वर्ग इस के रूप में सरल हो सकता है । मेरे मामले में, मेरे दृश्य पदानुक्रम में बीजी इमेज था, एक मध्यम जमीन जहां अन्य सभी कार्यक्षमताएं हुईं, और fgImage।

ऐप को प्रोफ़ाइल करने के लिए एंड्रॉइड एसडीके उपकरण पदानुक्रम व्यूअर का उपयोग करें और देखें कि प्रत्येक दृश्य कितनी तेजी से आकर्षित करने जा रहा है। मेरे ऐप ने bgImage और fgImage को चित्रित करने में 30-40ms खर्च किए। प्री-स्केलिंग और ओवरराइडिंग ड्रॉ ने 30-40 एमएमएस से लगभग 1.5 एमएमएस कम कर दिया।

यहाँ है मेरे विचार से एक के लिए ड्रा प्रदर्शन का एक स्क्रीनशॉट पहले और बाद में:

से पहले: Using setImageBitmap instead of overriding onDraw.

के बाद: Using the above DTImageView which simply overrides OnDraw

1

मैं एक ही समस्या थी और मैंने इसे इस विधि का उपयोग करके हल किया:

res निर्देशिका के अंतर्गत स्थित mipmap फ़ोल्डर में अपनी छवि जोड़ें। यह छवि को घनत्व के अनुसार जोड़ देगा।

6

मुझे थोड़ा देर हो चुकी है, लेकिन यह मुझे थोड़ा सा है, और जब GPU डीबगर चलाते हुए, मैंने देखा कि सिस्टम ने मेरी छवि को बढ़ाया है! मेरे पास 1920x1080 छवि थी, और यह 3780x6720 बनावट के रूप में दिखाई दिया!

आदर्श रूप से, आपके संबंधित फ़ोल्डर में प्रत्येक घनत्व के लिए बनावट होना चाहिए (res/drawable-mdpi, res/drawable-hdpi, आदि)।

हालांकि, अगर आपको लगता है अपने एक बनावट ठीक है, यह res/drawable-nodpi में डाल दिया, नहींres/drawable। यदि आप इसे res/drawable-nodpi में डालते हैं, तो सिस्टम डीपीआई के आधार पर इसे स्केल नहीं करेगा।

मेरे मामले में, यह पिक्सेल एक्सएल पर 60fps की पूर्ण फ्रेम दर पर 10fps से एक साधारण यूआई बदल गया।

3

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

public void setBackground(Context context, View view, int drawableId){ 
    Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), drawableId); 
    int width = Resources.getSystem().getDisplayMetrics().widthPixels; 
    int height = Resources.getSystem().getDisplayMetrics().heightPixels; 
    bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true); 
    BitmapDrawable bitmapDrawable = new BitmapDrawable(context.getResources(), bitmap); 
    view.setBackground(bitmapDrawable); 
} 
+0

यह मेरे लिए अच्छा काम किया! –

0

आकार 1080x1920 के साथ केवल एक पृष्ठभूमि छवि जोड़ सकते हैं और drawable-nodpi फ़ोल्डर में रख दें और कि इस समस्या को

संबंधित मुद्दे