hwui简介

简介:
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,这样做的目的也是为了减少渲染状态的切换,提升系统的绘制性能。
### HWUI 渲染机制概述 HWUI (Hardware Accelerated UI) 是 Android 中负责处理图形渲染的核心模块之一。该模块旨在利用 GPU 来加速界面绘制操作,从而提高应用的流畅性和响应速度[^2]。 #### RenderNode 的作用 `RenderNode` 对应于视图层次结构中的单个节点。当 `View` 显示状态发生改变时,会触发重新计算所有子项的位置并更新相应的 `DisplayList`。此过程涉及保存和管理诸如透明度、边框等样式属性的信息[^3]。 #### DisplayList 工作原理 为了优化性能,Android 使用了延迟渲染技术——即将所有的绘图指令先存入到 `DisplayListData` 结构体中而不立刻执行这些命令。这样做的好处是可以减少频繁调用 OpenGL API 带来的开销,并降低系统功耗。最终,在适当的时候通过一次性的 `drawDisplayList()` 调用来批量提交所有缓存下来的绘图请求给 GPU 处理[^4]。 ```java // 创建一个新的 Canvas 并关联至指定的 RenderNode 实例 Canvas canvas = new Canvas(renderNode); // 开始记录绘制命令到当前 RenderNode 关联的 DisplayList 中 canvas.drawColor(Color.RED); canvas.drawText("Hello World", 10, 50, paint); // 完成录制后结束编辑模式 renderNode.endRecording(); ``` #### 性能监控与调试技巧 开发者可以结合使用 `StrictMode` 和 “Profile HWUI Rendering” 功能来检测是否存在过度消耗资源的情况。一旦超过设定阈值,则意味着可能发生了帧丢失现象,这通常提示着存在潜在的性能瓶颈需要进一步排查[^5]。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值