2010-12-01 2 views
5

私は自分のプロファイリングを行っており、ほとんどの時間はdrawBitmapで費やされているようです。AndroidでCanvas drawing-drawBitmapを最適化する方法は?

私は、LunarLanderサンプルで示されているように、SurfaceView/Updating thread/canvas lockingアプローチを使用します。しかし、私は非常に最初のフレーム上の

  • へと(this questionに応じて)、それを変更しました
  • その上にビットマップバッファを構築し、ペイントそのビットマップ(私の画面の変更ではないすべてを)再利用する後続の各フレームをペイント
  • 各フレームの端(画面に)ターゲットキャンバスに一度バッファを描く

でTraceviewこのdrawBitmapが私の800×480のデバイス上のフレーム毎に5ミリ秒を要することを私に示しました。それ以上のものを手に入れることはできますか?それとも、「石に彫られた」もので、毎秒良いフレームを達成するためにコードの他の部分を最適化する必要がありますか?

+0

あなたは、各フレーム汚い四角形を追跡し、それだけでは更新できますか?明らかに、左上と右下隅をちょっと変えれば、それはあまり役に立たないでしょう。 – EboMike

+0

おそらくOpenGLがあなたにとって良い選択になるでしょう。私は携帯電話とタブレットで多くのテストを行いました。drawBitmap()は、タブレットを中心に低すぎます。ただし、いくつかのオプションがあります:http://www.independent-software.com/android-speeding-up-canvas-drawbitmap/ –

答えて

10

多くのことに依存しますが、通常drawBitmap()はできるだけ速くなります。あなたの特定の場合、ブレンドする必要がない場合は、不透明なビットマップを使用していることを確認してください。また、サーフェスと互換性のある形式でビットマップを使用してみてください。たとえば、16ビットサーフェスを使用している場合、16ビット(RGB565)のビットマップを描画するのは非常に高速です(memcpy呼び出し)。サーフェスが32ビットの場合は、ARGB8888の不透明なビットマップを使用します。

+3

Surfaceのフォーマットを検出するにはどうすればよいですか? surfaceChangedに渡される "format"値は常に "-1"と思われます。 –

+0

@dpkあなたが検出するのではなく、setFormat()で自分で設定することができますhttp://developer.android.com/reference/android/view/SurfaceHolder.html#setFormat%28int%29 – Aron

関連する問題