kco*_*ock 8 performance android hardware-acceleration android-view
因此,我试图了解如何在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);
Run Code Online (Sandbox Code Playgroud)
我正在启用硬件层onAttachedToWindow()
并禁用它们onDetachedFromWindow()
,但我试图了解我是否真正使用它.从本质上讲,i/j
调用的循环drawBitmap()
永远不会改变; 唯一改变的是Canvas
翻译.是Bitmap
自动保存到GPU后面的纹理,还是我需要手动执行此操作?
您View.LAYER_TYPE_HARDWARE
准确设置了哪些视图?如果要在包含上面显示的绘图代码的视图上设置硬件层,则会导致系统执行大量必要的工作.由于您只是绘制位图,因此您无需在此处执行任何操作.如果您调用Canvas.drawBitmap()
框架将代表您缓存生成的OpenGL纹理.
但是,您可以更多地优化代码.drawBitmap()
您可以使用子视图,而不是调用.如果使用offset*()
方法(或setX()
/ setY()
)移动这些子项,框架将应用进一步的优化以避免draw()
再次调用方法.
通常,应该在视图上设置硬件图层,这些视图的绘制成本很高,而且其内容不会经常更改(所以与您正在做的事情完全相反:)
归档时间: |
|
查看次数: |
2926 次 |
最近记录: |