zl程序教程

您现在的位置是:首页 >  前端

当前栏目

HWUI(硬件加速绘制UI)简介

UI 简介 绘制 硬件加速
2023-09-14 09:16:14 时间

原址

简介:

hwui主要是android用于2d硬件绘图而加入的一个模块,在hwui之前,android主要是用skia来进行软件绘制,后由于绘制性能等问题,现在android的绘图几乎都是使用了hwui硬件加速绘图。hwui主要则是使用opengles来进行gpu硬件绘图,提升整个系统的绘制性能,主要有以下方式:直接渲染,显示列表渲染,延时渲染列表,分别代表的类为:OpenGLRenderer,DisplayListRenderer,DeferredDisplayList。

直接渲染:


OpenGLRenderer这个类是DisplayListRenderer和LayerRenderer的基类,也是最终的实现类,该类中包含了所有的绘制函数,也称为立即绘制,如果可以的话是可以不需要其他子类的继承,直接调用就可以用于绘制的,但是如果直接由应用直接频繁调用该接口将会影响系统的绘制性能,这也就是为什么引入显示列表的原因了。

显示列表渲染:

DisplayListRenderer这个类用于将全部的绘图指令保存在DisplayListData这个结构中。显示列表是一定会使用的,其目的就是将全部的绘图指令全部保存起来,而不是立即绘制,其实显示列表渲染,就是一种延时渲染了,将指令存储起来的目的是防止频繁的调用opengl接口,由于GPU的运算很快,如果较为频繁的调用OpenGL的API,不仅会影响它执行的性能,同时也会增加系统的功耗,所以android采用了显示列表的形式,将全部的命令存储起来,等最后命令都收集完后,调用drawDisplayList,一次性将全部的绘图指令释放,能够提升GPU运行性能,在Android4.2之前都是采用这套绘制方式进行硬件加速的。

延时渲染列表:

在Android4.4之后,加入了延时渲染列表,DeferredDisplayList是基于DisplayListRenderer的基础上,当将显示列表构建好后,调用drawDisplayList时,开始构建延时渲染列表,延时渲染相对显示列表主要做了一下优化工作:
1. 通过计算过度绘制区域,将明显的且被覆盖的区域剔除,从而能够减少过度绘制和减少绘制指令。(其实google完全可以在hwui层中将过度绘制区域全部剔除,可以做到几乎不存在过度绘制的情况,估计也有考虑将过度绘制区域裁剪,将会引入更多的绘图指令与裁剪区域,估计性能不佳,或者google的下一个版本将会有该功能)
2. 将绘图指令进行分批次(Batch),将相同的绘制指令,但是不相交的区域(不能相交是为了防止层级之间绘制错乱的问题),将这个全部合并为一次绘制指令(也称为multiDraw),只要设置好相对应的纹理坐标等,就能在一次绘制指令中完成,即减少了多次调用绘制指令,也减少了多次的着色器上传等,同时也将相同批次一起绘制,减少了渲染状态的切换,较少着色器的上传等,能够较大提升系统的性能。(现在支持合并区域绘制的有DrawTextOp,DrawBitmapOp,DrawPatchOp)
3. 将相同绘制指令,但是不能合并的绘制指令,且不能相交的区域,组成一个DrawBatch,这样做的目的也是为了减少渲染状态的切换,提升系统的绘制性能。