2013-01-22 23 views
2

视图可以具有LAYER_TYPE_HARDWARE(view.setLayerType(LAYER_TYPE_HARDWARE,null))的layerType,它告诉它将缓存绘制到GPU中。我怎么知道这个缓存的绘制频率?它有什么规则?我会假设每次视图调用invalidate或onDraw时,LAYER_TYPE_HARDWARE都必须创建一个新的缓存。如果这是真的,对于调用了大量绘图的视图来说,没有LAYER_TYPE_HARDWARE似乎更好,因为它有两倍的工作量(因为绘制到未使用的高速缓存将是开销)。LAYER_TYPE_HARDWARE并绘制到缓存

无论如何,我看不到任何挂钩,我可以登录和设置开发选项来闪烁在GPU上的屏幕没有看到做任何事情。

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

回答

6

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

它被创建的时候,你首先调用view.setLayerType(LAYER_TYPE_HARDWARE,NULL)

在幕后,你的视图的快照,并上传作为纹理的GPU。

如何判断此缓存的绘制频率? 有哪些规则呢?

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

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

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

取决于。就像在前一段中提到的那样,如果您使用图层友好属性(如alpha,x,y,缩放和旋转),则invalidating不会导致重绘。在这种情况下,不会上传新纹理。

但由于对其他属性的更改而导致无效,将导致纹理上传,并且会比仅绘制图层时更慢。

+1

我在哪里可以获得这些属性的列表,哪些不会导致重绘? – SlowAndSteady