2017-05-29 7 views
9

मेरे पास एक ऐसा ऐप है जो नए Google Play कंसोल में नीचे 25% के रूप में सूचीबद्ध है - स्लो रेंडरिंग के लिए एंड्रॉइड राजधानियां अनुभाग। मुझे इस बात से चिंतित है कि such articles की वजह से ऐसा लगता है कि Google Play Play Store रैंकिंग में आपके ऐप को दंडित कर सकता है यदि आप नीचे 25% में आते हैं।धीमी रेंडरिंग (एंड्रॉइड राजधानियां) को ठीक करने के लिए कैसे करें

हालांकि, मेरे ऐप के लिए इस मीट्रिक में सुधार करना असंभव प्रतीत होता है। यह संगीत बजाता है और एक सेकबार और टेक्स्ट व्यू है जिसे हर 250 एमएमएस में अपडेट किया जाता है क्योंकि कोई भी संगीत खिलाड़ी होगा।

public class MainActivity extends AppCompatActivity { 

    int count; 
    SeekBar seekBar; 
    TextView textView; 

    Runnable runnable = 
      new Runnable() { 
       @Override 
       public void run() { 
        textView.setText(Integer.toString(count)); 
        seekBar.setProgress(count); 
        ++count; 
        seekBar.postDelayed(runnable, 250); 
       } 
      }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     seekBar = (SeekBar) findViewById(R.id.seek); 
     textView = (TextView) findViewById(R.id.text); 
     seekBar.post(runnable); 
    } 
} 

पूर्ण यहाँ परियोजना: https://github.com/svenoaks/SlowRendering.git

जब मैं हार्डवेयर पर इस कार्यक्रम के नेक्सस उपकरणों के लिए इसी तरह चलाने के लिए, मैं एक
adb shell dumpsys gfxinfo com.example.xyz.slowrendering आदेश के लिए ये परिणाम प्राप्त:

मैं प्रदर्शित करने के लिए कम से कम बुनियादी कार्यक्रम बनाया
Stats since: 19222191084749ns 
Total frames rendered: 308 
Janky frames: 290 (94.16%) 
90th percentile: 32ms 
95th percentile: 36ms 
99th percentile: 44ms 
Number Missed Vsync: 2 
Number High input latency: 0 
Number Slow UI thread: 139 
Number Slow bitmap uploads: 0 
Number Slow issue draw commands: 283 

इसका मतलब यह होगा कि मेरे सभी फ्रेमों को प्रस्तुत करने के लिए 16 मिमी> मुझे लगता है कि अद्यतन की आवधिक प्रकृति के कारण मुझे लगता है। मैंने परीक्षण किए गए सभी अन्य संगीत प्लेयर ऐप्स में भी धीमी रेंडरिंग समस्या है जहां तक ​​मैं देख सकता हूं। मुझे डर है कि Google की एल्गोरिदम मेरी ऐप रैंकिंग को बर्बाद कर रही है, क्या कोई तरीका है कि मैं अपना स्कोर सुधार सकता हूं?

उत्तर

9

आपके लेआउट में TextView समस्या का कारण बन रहा है। क्योंकि wrap_content में layout width है, जिसने कहा है कि इसकी चौड़ाई सामग्री की चौड़ाई (इस उदाहरण में पाठ) के बराबर होनी चाहिए। इसलिए, हर बार जब आप TextView.setText पर कॉल करते हैं तो एक महंगा उपाय/लेआउट पास होना पड़ता है। layout_width से match_parent पर सरल सेटिंग समस्या को हल करेगी।

enter image description here

enter image description here

यहाँ दो छवियों क्या systrace से लिया जाता है, यह 1 फ्रेम में यूआई धागे पर काम चलाने का प्रदर्शन कर रहे हैं। शीर्ष एक layout_width=wrap_content के साथ किया जाता है और नीचे वाला layout_width=match_parent है।

दो निम्न विधियों है कि मैं फ्रेम दर में सुधार होगा परीक्षण किया है: आप 16ms (seekBar.postDelayed(runnable, 16)) की तरह कम अवधि में runnable पोस्ट करते हैं

  • , तो आप इस चिकनी 60fps मिलती है: enter image description here

    पी/एस: मुझे यकीन नहीं है कि अभी तक क्यों।

  • Runnable के अंदर count मान को अपडेट करने के लिए किसी अन्य तरीके का उपयोग करें। रननेबल को फिर से निर्धारित करने के लिए View.postOnAnimation(Runnable) का उपयोग करें। नमूना परियोजना के लिए परिणाम 60 एफपीएस है।

संपादित करें: दो RunnablepostOnAnimation(Runnable)

Runnable runnable = 
    new Runnable() { 
    @Override 
    public void run() { 
     textView.setText(Integer.toString(count)); 
     seekBar.setProgress(count); 
     seekBar.postOnAnimation(this); 
    } 
    }; 



Runnable updateCount = new Runnable() { 
    @Override public void run() { 
     ++count; 
     seekBar.postDelayed(this, 250); 
    } 
    }; 
+0

मै मैक्स एक्स शुद्ध और गैलेक्सी एस 8 + दोनों पर match_parent और अभी भी ज्यादातर जंकी फ्रेमों के लिए layout_width सेट करता हूं। हालांकि एक्स शुद्ध 'धीमी यूआई थ्रेड' श्रेणी के साथ कुछ फ्रेम हैं और 90 वें - 99 वें प्रतिशत फ्रेम केवल 20ms से कम हो गए हैं। –

+0

क्या आप नमूना प्रोजेक्ट या अपने उत्पादन ऐप के बारे में बात कर रहे हैं? –

+0

janky नमूना परियोजना match_parent –

2

मैं अपने कोड की जाँच की का उपयोग करता है। सुनिश्चित नहीं है कि यह वास्तविक कोड है या यदि आपके पास यह अधिक है। किसी भी मामले में मैं एंड्रॉइड में कुछ प्रस्तुत करने वाले मुद्दों पर ध्यान आकर्षित करूंगा।

1. ओवरड्रॉ

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

ओवरड्रा के कारण कुछ भी हो सकते हैं, इसके लिए अपना कोड जांचने का प्रयास करें। डेवलपर विकल्पों में ओवरड्रा जांचने के लिए सभी मोबाइल उपकरणों में एक डेवलपर टूल इंस्टॉल किया गया है। Here ओवरड्रा के लिए आधिकारिक दस्तावेज है।

2. पदानुक्रम देखें

प्रत्येक दृश्य प्रस्तुत करना के लिए, Android तीन चरणों से होकर जाता है:

1.measure

2.layout

3.draw

इन चरणों को पूरा करने के लिए एंड्रॉइड को ले जाने का समय आपके पदानुक्रम में विचारों की संख्या के समान है। मैं आपकी लेआउट फ़ाइल में देखता हूं कि आपके पास बाधा लेआउट है जिसमें एक रैखिक लेआउट शामिल है। मुझे इसका उपयोग नहीं दिख रहा है। डेवलपर्स को दृश्य पदानुक्रम को कम करने में मदद करने के लिए बाधा लेआउट पेश किया गया था। किसी विशेष लेआउट के बच्चों की संख्या कम करें। इसके साथ आपकी सहायता करने के लिए एक टूल भी है। Here इसके लिए आधिकारिक एंड्रॉइड गाइड है। GPU प्रतिपादन समस्याओं को समझने के लिए इन चरणों का प्रयास करें।

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