2011-11-28 50 views
0

我的應用程序以連續循環的方式繪製到畫布上,並在每個循環中重新評估drawable的位置並將它們循環爲動畫。我的問題是以下兩種方法中的哪一種更好,爲什麼?我是一個初學者,所以我不知道如何對方法進行基準測試,所以如果你可以,或者你已經有了,我會很感激這個輸入。Draw()或DrawBitmap()?

第一種方法(我正在使用的方法)是將png資源分配爲Handle作爲Drawable。然後我每次想畫我調用對象:

Drawable.setBounds(x,y,x,y); 
Drawable.draw(canvas); 

我的問題是它會更快(在構造函數中),解碼資源爲位圖,然後擴展它,它在適當的大小。然後在每個循環畫出通過資源:

canvas.drawBitmap(DrawableName, 0, 0, null); 

我之所以問的是我的應用程序吸引數以百計的資源,所以改變一些做得不夠告訴區別,我想知道在我修改代碼之前是否會以這種方式顯着加快速度。無論如何,我需要以某種方式提高性能,所以也歡迎任何其他好的想法。

+0

通過使用canvas.drawBitmap,您可以獲得相當大的性能提升。看看這個:http://stackoverflow.com/questions/4296441/android-canvas-drawbitmap-vs-drawable-draw-huge-performance-boost – MetalRain

回答

1

通常情況下,繪製位圖的速度比繪製要快,因爲繪製位圖只是將內存轉儲到屏幕上。如果您需要繪製縮放的位圖,則使用createScaledBitmap將其繪製爲一個,而不是創建它,然後對其進行縮放。

Bitmap myBitmap = BitmapFactory.decodeFile(myFile.getPath()); 
myBitmap = myBitmap.createScaledBitmap(myBitmap, width, height, true); 

The Android developers documentation on the above function

計算和繪製圖元運行需要計算,而並吸引了許多人的時候會降低性能,所以在這裏你可以使用更多的位圖 - 但要小心做過早的:你可以做到這一點優化 - 如果沒有必要創建大量位圖,沒有意義,因爲不會有重要的(即顯着的)性能提升。

+0

感謝您的幫助,並感謝上面的評論。我想我可能不得不這樣做。我創建了一個fps計數器,並發現我在某些地方以20fps的速度觸底,並且通過消除主循環中的繪圖,fps上升到5000以上,告訴我在我的應用中繪圖很重,需要優化。由於物理計算只在繪製完最後一幀後完成,因此我已將循環限制爲僅在33 ms後才進行下一次迭代。這意味着我已經將動畫限制在30幀/秒,而不管設備能夠以多快的速度完成繪製序列...... – cody

+0

...這樣可以保持物理一致性,只要設備能夠完成單個循環33毫秒。如果不是整個遊戲只是落後於處理器才能趕上。我正在考慮添加一個跳幀功能,以幫助在較慢的設備上抑制問題,但可以通過顯着加速繪圖來避免這種情況。 – cody