2011-07-15 62 views
8

我正在將Windows Phone 7(在XNA 4.0中開發)移植到Android上的2D動作遊戲。我正在使用Canvas.drawBitmap()調用的批次 - 每幀大約200-300次更新 - 每次調用時都會使用不同的Paints來處理繪製時不同的透明度和着色。這是管理粒子系統和各種其他覆蓋和遊戲中的效果,以及平鋪背景和遊戲中的精靈。我沒有做任何按需調整大小或旋轉,它是簡單的src-> dest矩形大小相同。Android Canvas.drawBitmap性能不佳 - 切換到OpenGL?

在WP7上運行速度爲30 + fps,但我在我的測試'droid硬件(Samsung Galaxy S)上掙扎了12fps。這使得遊戲無法播放。通過剖析代碼,我已經證實,我所有的時間都在Canvas中丟失。我似乎遵循了所有常見的性能建議 - 使用SurfaceView,注意GC,因此不會產生一次性拋棄對象,並避免Drawables。

我正確理解Canvas.drawBitmap()是CPU綁定的,如果我想提高性能,我必須切換到使用GPU的OpenGL?我無法在任何地方發現它的禿頭,但在一些評論之間閱讀,我認爲這可能是我的下一步......?

+1

你是如何繪製你的位圖?什麼顏色格式?什麼尺寸?在圖形編程中,有很多事情要尊重事物的快速發展。請張貼一些代碼。 –

+1

偉大的問題。我有與Canvas.drawBitmap()相同的問題,並最終在openGl中移植遊戲,但也許我錯過了一個超級祕密的Canvas選項? –

+0

遊戲是100多個班級,長達數萬行。我不確定我可以發佈一個合理的摘錄,這將是特別豐富的。 Rects從16x6到128x128不等,全部ARGB_8888 –

回答

7

這是正常現象。使用透明度時,畫布的速度非常慢(如ARGB_8888)。

2個選擇:

  • 切換到OpenGL ES
  • 使用盡可能少的透明度,對你的位圖(即使用RGB_565最即可)。
+0

謝謝。只是想在我離開之前得到證實,並學習了一個全新的圖形堆棧,以防我正在做一些愚蠢的事情...... –

1

也許因爲它使用硬件加速的畫布操作這將運行在Android更好3+。