2010-12-01 9 views
5

मैंने अपनी प्रोफाइलिंग की है और ऐसा लगता है कि मेरा अधिकांश समय ड्रॉ बिटमैप के दौरान बिताया जाता है, जिसे प्रत्येक फ्रेम पर (समझदारी से) कहा जाता है।कैनवास ड्राइंग को अनुकूलित कैसे करें - एंड्रॉइड पर drawBitmap?

मैं सुरंग दृश्य/अद्यतन थ्रेड/कैनवास लॉकिंग दृष्टिकोण का उपयोग करता हूं जैसा कि चंद्र लैंडर नमूने में दिखाया गया है। लेकिन मैं

    पहले ही फ्रेम पर
  • के रूप में (this question के अनुसार) यह बदल दिया है एक बिटमैप बफर का निर्माण और रंग पर इसे
  • रंग प्रत्येक अनुवर्ती फ्रेम पुन: उपयोग कि बिटमैप (अपनी स्क्रीन परिवर्तन पर सब कुछ नहीं है)
  • प्रत्येक फ्रेम के अंत में लक्ष्य कैनवास (स्क्रीन पर)

Traceview मुझे पता चला कि इस drawBitmap मेरी 800x480 डिवाइस पर प्रत्येक फ्रेम के लिए 5ms लेता में एक बार बफर पेंट। क्या मैं उससे बेहतर कुछ प्राप्त कर सकता हूं या यह सिर्फ कुछ ऐसा है जो 'पत्थर में बना हुआ' है और मुझे प्रति सेकंड अच्छे फ्रेम प्राप्त करने के लिए कोड के अन्य हिस्सों को अनुकूलित करना होगा?

+0

आप गंदा आयत का ट्रैक प्रत्येक फ्रेम रख सकते और केवल कि अद्यतन? जाहिर है, यदि आप ऊपरी बाएं और निचले दाएं कोने में थोड़ा सा बदलते हैं तो इससे आपको बहुत मदद नहीं मिलेगी। – EboMike

+0

ओपनजीएल शायद आपके लिए बेहतर विकल्प होगा। मैंने फोन और टैबलेट पर कई परीक्षण चलाए हैं और ड्रॉ बिटमैप() मुख्य रूप से टैबलेट पर बहुत धीमी है। हालांकि, यहां आपके लिए कुछ विकल्प दिए गए हैं: http://www.independent-software.com/android-speeding-up-canvas-drawbitmap/ –

उत्तर

10

यह कई चीजों पर निर्भर करता है, लेकिन आमतौर पर drawBitmap() जितना तेज़ हो सकता है उतना तेज़ होगा। आपके विशेष मामले में, यदि आपको मिश्रण की आवश्यकता नहीं है, तो सुनिश्चित करें कि आप एक अपारदर्शी बिटमैप का उपयोग कर रहे हैं। इसके अलावा, अपने सतह के साथ संगत प्रारूप में बिटमैप का उपयोग करने का प्रयास करें। उदाहरण के लिए, यदि आप 16 बिट्स सतह का उपयोग कर रहे हैं, तो 16-बिट्स (आरजीबी 565) बिटमैप ड्राइंग बहुत तेज़ होगा (यह सिर्फ एक यादगार कॉल है।) यदि आपकी सतह 32 बिट्स है, तो ARGB8888 अपारदर्शी बिटमैप का उपयोग करें।

+3

आप सतह के प्रारूप का पता लगाने की सलाह कैसे देते हैं? सतही में "प्रारूप" मान पारित किया गया है हमेशा लग रहा है "-1"। –

+0

@dpk यह पता लगाने के बजाय आप इसे सेटफॉर्मैट() http://developer.android.com/reference/android/view/SurfaceHolder.html#setFormat%28int%29 – Aron

1

बस एक अनुमान है। शायद यह उपयोगी होगा - Window Backgrounds & UI Speed

+0

धन्यवाद के साथ सेट कर सकते हैं, लेकिन मुझे पहले से ही कवर किया गया है: -) – Axarydax

0

सबसे तेज़ ड्राइंग लाइब्रेरी के लिए एक प्रतियोगिता चल रही है ... libgdx वर्तमान में जीत रहा है ... नमूना ऐप्स भी आपके जैसे 800x480 का उपयोग करते हैं।

http://code.google.com/p/libgdx/wiki/SimpleApp#Project_Setup

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