ビットマップをキャンバスに描画するのが最も速い方法は何でしょうか?
現在、描画呼び出しをダブルバッファリングするために使用するビットマップ(および描画用のキャンバス)があり、キャンバスに描画すると、1pxのキャンバス変換を適用することでスクロール効果があります。これだけで、フレームレートが60+ FPSから約40に低下し、かなりのヒットになります。現時点ではsurfaceView(またはGLSurfaceView)を使用していませんが、速度を向上させるものがないかどうか疑問に思っています。以下のonDraw()コード
@Override
public void onDraw(Canvas canvas)
{
//update fps text
mFpsTracker.frameTouch();
if(mBufferedBitmap == null)
{
mBufferedBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_4444);
mBufferedCanvas = new Canvas(mBufferedBitmap);
}
Paint.setColor(Color.BLUE);
mBufferedCanvas.drawLine(0, getHeight(), getWidth(), getHeight(), Paint);
mBufferedCanvas.translate(0, -1);
canvas.drawBitmap(mBufferedBitmap, 0, 0, null);
//draw fps
mTextPaint.setColor(Color.WHITE);
canvas.drawText(mFpsTracker.getFPSString(), 40, 40, mTextPaint);
invalidate();
}
romain Guyによる this ブログ投稿を参照してください。
ビデオ版が利用可能です ここ 。
ARGB_4444はもう使用しないでください。非推奨です。各ピクセルには、チャネルごとに4ビットしか割り当てられません(そのため、この名前が付けられています)。 ARBG_8888は、ARBG_4444の4,096の代わりに16,777,216色を提供しますが、2ではなくピクセルあたり4バイトを使用します。
Gingerbreadでは、Android ARGB_8888を Surface の標準形式にし、そのためプロセスごとのメモリ割り当てを増やしました。
Window's および(合理化された SurfaceView )SurfaceHolderの形式を RGBA_8888 に設定する方が効率的です。これにより、著しく遅いフォーマット変更が回避されます。
その他のヒントは次のとおりです。
2.1デバイスでは、50fpsで画面上に少なくとも300ビットマップを描画できます。
私はあなたと同じ問題を抱えています。何か新しいものを見つけたら教えてください。
これは私がこれまでに設立したものです:
OnSizeChangeでは、キャンバスのサイズに応じてビットマップのサイズを変更したり作成したりできます。フレームの描画は約60 fpsとはるかに高速になりますが、無限ループでカスタムビューを使用すると、一部のデバイスで速度が低下し、一部のAndroidデバイスでジャンプします。したがって、私はそれをお勧めしません。代わりに、SurfaceViewを使用することをお勧めします。
この例を確認してください: キャンバス内でアニメーションフレームワークを使用するにはどうすればよいですか?
どこかにビットマップを作成する必要があります(例onCreateまたは他の場所(コンストラクターが適しています))。スクロール効果を実行すると、新しいビットマップが何度も作成されるためです。したがって、このビットマップを使用するよりも、コンストラクターで作成する必要があります。
私が同様の問題を抱えているとき、それは私にとって良い解決策です。このmBufferedBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_4444);
を無効化しない他の場所で作成してみてください。それがあなたの助けになることを願っています。
キャンバスから良いパフォーマンスを得ることができると思います。しかし、それは多くの作業を必要とします。
あなたが良いパフォーマンスのグラフィックライブラリから始めれば、あなたが多くのことを間違えたとしても、あなたはおそらくそれでも良いパフォーマンスで終わるでしょう:) lol
最速の描画ライブラリをめぐって競争が繰り広げられています... libgdxが現在勝っています...
http://code.google.com/p/libgdx/wiki/SimpleApp#Project_Setup