Android 渲染过程分析

来源:互联网 发布:sql导入access数据库 编辑:程序博客网 时间:2024/05/16 17:26

1.每一个View对应一个RenderNode,一个独立的GLES20RecordingCanvas。

2.父视图的DisplayList包含所有子视图的DisplayList。

3.硬件加速和非硬件加速的时候Canvas是不一样的,前者是一个真的Canvas后者是一个GLES20RecordingCanvas对象,在GLES20RecordingCanvas上执行绘图命令时并没有真正绘制,而是将这些命令封装成一个个DrawOp对象。最后添加到DisplayList中。比如调用canvas.drawArc()的过程如下:

GLES20Canvas.drawArc()-->android_view_GLES20Canvas_drawArc()-->renderer->drawArc(left, top, right, bottom, startAngle, sweepAngle, useCenter, paint)-->DisplayListRenderer::drawArc()-->addDrawOp(new (alloc()) DrawArcOp(left, top, right, bottom,startAngle, sweepAngle, useCenter, paint))

4.GLES20RecordingCanvas继承自GLES20Canvas继承自HardwareCanvas,在GLES20Canvas有属性mRenderer对应一个native层的DisplayListRenderer对象。GLES20RecordingCanvas还有一个属性mNode,对应一个RenderNode。

5.DisplayListRenderer的属性mDisplayListData保存他对应的RenderNode对应的View的所有直接子View对应的DrawRenderNodeOp。而属性chunks保存的是所有的chunks,这里chunks简单的理解是把很多的DisplayList进行分块,分块的原因是不同块的有些不同的特性,而且这个分块是以View为基本单位的,也就是一般几个共性的View组成一个chunk。最后属性mDisplayListData保存的是所有的绘制命令也就是DisplayList。



6.常见的DrawOp有:DrawLayerOp,DrawRenderNodeOp,DrawBitmapOp,DrawArcOp等等。并最终通过函数size_t DisplayListRenderer::addDrawOp(DrawOp* op) 添加到DisplayList中。

7.如果一个View是非硬件加速的会先将View绘制在一个普通的Bitmap上,然后作为一个DrawBitmapOp命令添加到DisplayList中。

8.如果一个View是TextureView,会将他对应的Layer,封装成一个DrawLayerOp命令添加到DisplayList中。

9.一个View的每个子View会封装成一个DrawRenderNodeOp对象添加到DisplayList中。这样子在真正渲染的时候就会去调用他的子View的渲染命令。

0 0