hwui——Layer的使用

简介:

hwui的layer中包括3种:

1. 普通的layer,用于作为当前一种状态的保存,可以使用fbo或者glCopyTexture来作为一张纹理使用
2. 创建一个HardwareLayer也就是实现以fbo的形式实现,通过view中使用buildLayer来创建,GLES20RenderLayer

3. 创建的是一个textureLayer,这个layer的SurfaceTexture直接是由系统pmem中分配的 GLES20TextureLayer

普通的layer:

hwui——Layer的使用_第1张图片
layer的创建:
这个layer的创建是通过上层canvas.saveLayer的方式来创建的,当调用saveLayer的时候,首先会先去创建一个新的SnapShot用来保存当前的矩阵变换信息,接着去调用createLayer来创建layer。根据应用传入的参数saveFlag来判断,当flag包含CLIP_TO_LAYER_SAVE_FLAG时,则将使用fbo的形式绘图,也就是这时将重新新建一个texture用于fbo的绘图,以前的绘图内容不会影响这次的绘图效果,后续的绘制都在这个fbo上,直到调用其他的restore。如果输入的flag不包含CLIP_TO_LAYER_SAVE_FLAG时,此时将会使用glCopyTexSubImage2D,也就是创建一个新的layer和纹理,同时将以前绘制的内容都拷贝到当前的纹理中,也就是包含的关系,但是由于gpu的原因,几乎的gpu在实现glCopyTexSubImage2D函数的时候都是很慢的,这样也就是极大的影响了系统的绘制性能,因此建议在绘图的时候,如果没有特殊要求,推荐都使用fbo来进行绘图,而不应该去使用glCopyTexSubImage2D,也就是在saveLayer的时候,传入的参数至少要包含CLIP_TO_LAYER_SAVE_FLAG。
layer绘图的实现:
当调用了saveLayer后,后续的绘图都将会作用到当前创建的layer上,也就是直接会将内容填充在layer的texture中,但是由于layer只是保存纹理,最后将纹理显示在屏幕上是当用户调用了restore的时候,将会对当前的SnapShot做一个判断,如果是kFlagIsLayer,那么将会调用composeLayer来实现layer的合成,也就是绘制layer上对应的纹理。

GLES20RenderLayer:

hwui——Layer的使用_第2张图片
这个layer是用于创建一个fbo的layer,用于整个view的绘图使用的。当用户绘制的一块区域将不经常变化,且经常需要对该区域做各种整体的变换(比如桌面的每屏图标),这样就可以将这个view作为一个fbo,将能够极大提升绘制性能。
使用方式:
当需要创建一个fbo的layer的时候,设置当前view的setLayerType的layerType设置为LAYER_TYPE_HARDWARE,这样当绘图开始时,将会去判断,如果当前的view的layerType设置为LAYER_TYPE_HARDWARE时,则将会自动去调用buildLayer,这时将会去调用LayerRenderer的createLayer函数来创建一个fbo的layer,同时将调用view的getHardwareLayerDisplayList函数,来为这个layer创建一个displayList,同时将view绘图的所有绘制指令保存在这个layer的displayList中,这样layer绘制的时候,将会直接去调用自身的displayList即可。
最后,将会通过viewRoot去调用pushHardwareLayerUpdate,将当前创建的layer保存在OpenGLRenderer中,这样在帧渲染开始时,将会首先去绘制所有layer的绘图信息,接着才开始其他的绘制指令的释放。最后按照绘图的渲染顺序,当去取得view的display的时候,会去调用drawHardwareLayer,来实现整个fbo的绘制。

你可能感兴趣的:(layer,硬件加速,HWUI)