ハードウェアアクセラレーション(利用可能な場合)を永続的にアニメートするカスタムView
で正しく使用する方法を理解しようとしています。これは私のonDraw()
の基本的な前提である:カスタムビュー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()
でそれらを無効にしていますが、私は実際にそれを使用しているかどうかを理解しようとしています。基本的にdrawBitmap()
を呼び出すi/j
ループは決して変更されません。変更されるのはCanvas
です。 Bitmap
は自動的にGPUにテクスチャとして保存されますか、そうするために手動で行う必要がありますか?
をやっていることの反対は変更されませんする必要がありますビューに対して 'setLayerType(View.LAYER_TYPE_HARDWARE、null);'を設定していますか? GPUは、ユーザーが積極的にスクロールしている間だけイメージをキャッシュしますが、それ以外のリソースは消費しません。 – Slartibartfast
@Slartibartfastええ、レイヤータイプをハードウェアに設定しました。ユーザーは実際にはスクロールしません。ビューはそれ自身のコンテンツを連続的にスクロールしています。私はHW Accelerationを誤解しているかもしれませんが、私が描いているビットマップのグリッドをハードウェアレイヤーにレンダリングし、すべてのフレームでビットマップを再描画するのではなく翻訳するだけでいいと思います。 – kcoppock