8

Viewそのため、永続的にアニメーション化されているカスタムでハードウェア アクセラレーション (利用可能な場合) を適切に使用する方法を理解しようとしています。これは私の基本的な前提ですonDraw()

canvas.drawColor(mBackgroundColor);

for (Layer layer : mLayers) {
    canvas.save();
    canvas.translate(layer.x, layer.y);

    //Draw that number of images in a grid, offset by -1
    for (int i = -1; i < layer.xCount - 1; i++) {
        for (int j = -1; j < layer.yCount - 1; j++) {
            canvas.drawBitmap(layer.bitmap, layer.w * i, layer.h * j, null);
        }
    }

    //If the layer's x has moved past its width, reset back to a seamless position
    layer.x += ((difference * layer.xSpeed) / 1000f);
    float xOverlap = layer.x % layer.w;
    if (xOverlap > 0) {
        layer.x = xOverlap;
    }

    //If the layer's y has moved past its height, reset back to a seamless position
    layer.y += ((difference * layer.ySpeed) / 1000f);
    float yOverlap = layer.y % layer.h;
    if (yOverlap > 0) {
        layer.y = yOverlap;
    }

    canvas.restore();
}

//Redraw the view
ViewCompat.postInvalidateOnAnimation(this);

でハードウェア レイヤーを有効にしonAttachedToWindow()て で無効にしていますがonDetachedFromWindow()、実際に使用しているかどうかを理解しようとしています。基本的に、i/j呼び出すループdrawBitmap()は変更されません。変わるのはCanvas翻訳だけです。Bitmapバックグラウンドでテクスチャとして GPU に自動的に保存されますか、それとも手動で行う必要がありますか?

4

2 に答える 2

7

どのビューでView.LAYER_TYPE_HARDWARE正確に設定していますか? 上記の描画コードを含むビューにハードウェア レイヤーを設定している場合、システムが必要以上に多くの作業を行うことになります。ビットマップを描画するだけなので、ここでは何もする必要はありません。フレームワークを呼び出すとCanvas.drawBitmap()、結果の OpenGL テクスチャが代わりにキャッシュされます。

ただし、コードをもう少し最適化できます。を呼び出す代わりにdrawBitmap()、子ビューを使用できます。offset*()メソッド (またはsetX()/ )を使用してこれらの子を移動すると、フレームワークはさらに最適化を適用して、メソッドの再setY()呼び出しを回避します。draw()

一般に、ハードウェア レイヤーは、描画にコストがかかり、コンテンツが頻繁に変更されないビューに設定する必要があります (つまり、あなたがしていることとはほとんど反対です :)

于 2013-07-01T22:30:38.107 に答える
1

Android のTracer for OpenGL ESを使用して、ビューが OpenGL コマンドを発行するかどうかを確認できます。

developer.android.comから

Tracer は、Android アプリケーションの組み込みシステム (ES) コード用の OpenGL を分析するためのツールです。このツールを使用すると、OpenGL ES コマンドとフレームごとの画像をキャプチャできるため、グラフィックス コマンドがどのように実行されているかを理解するのに役立ちます。

Romain Guy によるAndroid Performance Study に関するチュートリアルもあり、その使用法をほぼ段階的に説明しています。

于 2013-07-01T12:27:45.680 に答える