web-dev-qa-db-ja.com

Android、ビットマップをキャンバスに描画する最速の方法

ビットマップをキャンバスに描画するのが最も速い方法は何でしょうか?

現在、描画呼び出しをダブルバッファリングするために使用するビットマップ(および描画用のキャンバス)があり、キャンバスに描画すると、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();       
}
13
Dori

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 に設定する方が効率的です。これにより、著しく遅いフォーマット変更が回避されます。

その他のヒントは次のとおりです。

  • アルファ合成を制限します。これには、Skiaからの比較的高価なブレンドが必要になるためです。
  • ARGB_8888を優先するビットマップ Options を要求します Config そしてディザリングを無効にします。
  • ウィンドウを削除します 背景 可能であれば。
  • ハードウェアアクセラレーションを有効にしますが、 サポートされていない操作 に注意してください。

2.1デバイスでは、50fpsで画面上に少なくとも300ビットマップを描画できます。

6
Mark

私はあなたと同じ問題を抱えています。何か新しいものを見つけたら教えてください。

これは私がこれまでに設立したものです:

  1. Androidバージョン> 3の場合、ハードウェアアクセラレーションが発生するため、ダブルバッファーを使用しない方がよい(マニフェストでtrueに設定する必要がある)
  2. set Paint.setDither(true) ARGB_4444とは異なる色のデバイスでより適切に機能し、ほとんどのデバイスはwitchです。 詳細はこちらをご覧ください
2
Ilya Gazman

OnSizeChangeでは、キャンバスのサイズに応じてビットマップのサイズを変更したり作成したりできます。フレームの描画は約60 fpsとはるかに高速になりますが、無限ループでカスタムビューを使用すると、一部のデバイスで速度が低下し、一部のAndroidデバイスでジャンプします。したがって、私はそれをお勧めしません。代わりに、SurfaceViewを使用することをお勧めします。

この例を確認してください: キャンバス内でアニメーションフレームワークを使用するにはどうすればよいですか?

1
Lumis

どこかにビットマップを作成する必要があります(例onCreateまたは他の場所(コンストラクターが適しています))。スクロール効果を実行すると、新しいビットマップが何度も作成されるためです。したがって、このビットマップを使用するよりも、コンストラクターで作成する必要があります。

私が同様の問題を抱えているとき、それは私にとって良い解決策です。このmBufferedBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_4444);を無効化しない他の場所で作成してみてください。それがあなたの助けになることを願っています。

0
Peter

キャンバスから良いパフォーマンスを得ることができると思います。しかし、それは多くの作業を必要とします。

あなたが良いパフォーマンスのグラフィックライブラリから始めれば、あなたが多くのことを間違えたとしても、あなたはおそらくそれでも良いパフォーマンスで終わるでしょう:) lol

最速の描画ライブラリをめぐって競争が繰り広げられています... libgdxが現在勝っています...

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

0
hamish