2

视图可以有一个图层类型为 LAYER_TYPE_HARDWARE (view.setLayerType(LAYER_TYPE_HARDWARE, null)),它告诉它将缓存绘制到 GPU 中。我怎么知道这个缓存被绘制的频率?它的规则是什么?我会假设每次视图调用 invalidate 或 onDraw LAYER_TYPE_HARDWARE 必须创建一个新的缓存。如果这是真的,对于经常调用 onDraw 的视图,最好不要使用 LAYER_TYPE_HARDWARE,因为有两倍的工作(因为绘制到不被使用的缓存会是开销)。

无论如何,我看不到可以记录的钩子,并且将开发选项设置为在 GPU 上闪烁屏幕也看不到任何操作。

TL:DR,我如何知道何时创建了新的图层缓存?

4

1 回答 1

6

我如何知道何时创建了新的图层缓存?

它是在您第一次调用 view.setLayerType(LAYER_TYPE_HARDWARE, null) 时创建的

在幕后,会拍摄您的视图快照并将其作为纹理上传到 GPU。

我怎么知道这个缓存被绘制的频率?它的规则是什么?

如果您正在更改某些属性,例如 alpha、视图坐标、缩放或旋转视图,则不会将新纹理上传到 GPU。这就是为什么硬件层适用于某些类型的动画的原因,因为您基本上只需将转换矩阵发送到 GPU 即可,而不是重绘(因此在层的情况下重新上传纹理)。

如果您更改视图的任何其他属性,则会将新纹理上传到 GPU,如果您在动画中执行此操作,这可能会很昂贵。

我会假设每次视图调用 invalidate 或 onDraw LAYER_TYPE_HARDWARE 必须创建一个新的缓存。

要看。如上一段所述,如果您使用 alpha、x、y、缩放和旋转等图层友好属性,则无效不会导致重绘。在这种情况下,不会上传新纹理。

但是,由于其他属性的更改而失效将导致纹理上传,并且比仅绘制没有图层的速度要慢。

于 2013-04-13T20:58:25.410 回答