1

キャンバスへのパスを描画する必要があるアプリケーションがあります。パスの数が増えると、累積的な描画アクションに時間がかかるため、描画キャッシュを使用して速度を向上させようと考えました。

これを行うには、次のonDrawようなメソッドがあります。

@Override
protected void onDraw(Canvas canvas) {
    Path path;
    Paint paint;
    synchronized(mPaths) {
        buildDrawingCache();
        Bitmap bmp = getDrawingCache();
        if(bmp!=null) canvas.drawBitmap(bmp,
                new Rect(0, 0, bmp.getWidth(), bmp.getHeight()),
                new Rect(getLeft(), getTop(), getRight(), getBottom()),
                null);
        for(int i=mLastCount; i<mPaths.size(); ++i) {
            path = mPaths.get(i);
            paint = mPaints.get(i);
            canvas.drawPath(path, paint);
        }
        mLastCount = 0;
        mDrawn = true;
        destroyDrawingCache();
    }
}

mPathsとはとオブジェクトmPaintsのリストであり、新しいものがいくつあるかを計算するメソッドを設定しているので、最後のものだけを再描画します。私は最初にandの代わりに呼び出しましたが、これは機能しませんでした (これは重要かもしれません)。PathPaintsetDrawingCacheEnabled(true)buildDrawingCache()destroyDrawingCache()

とにかく、このコードは機能します。キャンバスに書き込むことができるビットマップを生成し、最後のパスのみを描画します。パスをどんどん描画すると、まだ再描画されているかのように速度が低下することを除けば、すべて問題ありません。中のすべてのパスbuildDrawingCache()

それが起こっていることですか?理想的には、描画メソッドがビットマップをブリットしてから、その上に 1 つのパスを配置することを望みます。毎回すべてのパスからビットマップを生成している場合は、気にしない方がよいでしょう (実際、その場合は、おそらく独自のビットマップ生成コードを作成しますが、面倒に思えます)。

それが起こっていない場合、コードが遅くなる原因となっている可能性があるものは他にありますか?

4

0 に答える 0