Android GPU过度绘制实现原理
调试GPU过度绘制开关
Android开发者模式应用提供了“调试GPU过度绘制”这个开关。打开这个开关,可以进行GPU绘制次数检测(用户性能优化)
效果类似下述图片
- 过度绘制1次(Render2次):浅蓝色
- 过度绘制2次(Redner3次): 绿色
- 过度绘制3次以上红色
该工具性能优化,合理优化APP布局,减少布局嵌套。用以进行性能优化(比如减少带宽占用)
GPU过度绘制实现原理
从代码角度理解一下Android如何实现该功能
第一部分:Alpha计数。
Setting开发者模式
- 开发者模式中控制“GPU过度绘制”的对象,为DebugGpuOverdrawPreferenceController,点击开关实际上更新的是名为"debug_hw_overdraw"的属性。
HWUI - Properties.h/cpp 中属性进行了宏定义,如果属性值为show或show_deuteranomaly(这俩在颜色上有些区别,见后面颜色部分),会打开过度绘制功能。
- SkiaPipeline,renderframe时调用renderOverDraw
SKIA
- SkOverDrawCanvas,用于给每个像素的Alpha通道+1。核心在颜色矩阵。
颜色矩阵又4行5列。5列为 RGBA+便移。 4行是计算后的 RGBA值。
下述矩阵前三行为0,不对RGB做修改(算出来是0,因为使用了Kplus加法混合模式,增加叠加到目标像素。所加上去不会变)。第4行,每次会Alpha+1(1/255就是一个亮度单位)
staticconstexprfloatkIncrementAlpha[]={// R G B A 偏移0,0,0,0,0,// 输出 R0,0,0,0,0,// 输出 G0,0,0,0,0,// 输出 B0,0,0,0,1/255f// 输出 A};综上,绘制一次A+1。两次就是A+2。
第二部分:颜色绘制
HWUI
- 创建SkPaint画笔,设置绘制颜色。创建SkOverdrawColorFilter,根据aphal数量绘制颜色。
A R G B 0x00000000 ->透明黑色 绘制0次 0x00000000 ->透明黑色1次 0x2f0000ff ->半透明蓝色2次 0x2f00ff00 ->半透明绿色3次 0x3fff0000 ->半透明红色4次 0x7fff0000 ->半透明红色5次
SKIA
- 根据Alpha的值计算。比如 2/255 * 255 -> 颜色数组2->半透明蓝色