【Android】 GPU过度绘制实现原理

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就是一个亮度单位)
cpp 复制代码
static constexpr float kIncrementAlpha[] = {
    // R  G  B  A  偏移
    0, 0, 0, 0, 0,   // 输出 R
    0, 0, 0, 0, 0,   // 输出 G
    0, 0, 0, 0, 0,   // 输出 B
    0, 0, 0, 0, 1/255f // 输出 A
};

综上,绘制一次A+1。两次就是A+2。

第二部分:颜色绘制

HWUI

  • 创建SkPaint画笔,设置绘制颜色。创建SkOverdrawColorFilter,根据aphal数量绘制颜色。
bash 复制代码
  A R G B
0x00000000 -> 透明黑色    绘制0次
0x00000000 -> 透明黑色       1次 	
0x2f0000ff -> 半透明蓝色     2次
0x2f00ff00 -> 半透明绿色     3次
0x3fff0000 -> 半透明红色     4次
0x7fff0000 -> 半透明红色     5次


SKIA

  • 根据Alpha的值计算。比如 2/255 * 255 -> 颜色数组2->半透明蓝色
相关推荐
alexhilton3 小时前
Android XR 开发入门完全指南
android·kotlin·android jetpack
2501_915909068 小时前
全面解析iOS应用上架到App Store的完整流程与关键注意事项
android·macos·ios·小程序·uni-app·cocoa·iphone
淡淡的香烟10 小时前
AndroidAI使用心得
android
chjif11 小时前
Android 设备管控开发实战:无障碍如何准确识别当前前台 App?
android
chjif11 小时前
Android 设备管控开发实战:企业受控终端的 DNS 域名策略实现
android·华为·harmonyos
c2385612 小时前
MySQL 基础用法(下):查询进阶与核心特性
android·c语言·c++·mysql
math_hongfan13 小时前
鸿蒙Agent高级技能自定义开发:自定义意图服务/能力注册/Agent技能编排/服务插件开发实战
android·学习·华为·harmonyos·鸿蒙
2501_9151063214 小时前
iOS 证书类型及作用说明 账号证书与签名配置的完整解读
android·ios·小程序·https·uni-app·iphone·webview
九皇叔叔14 小时前
RHEL9 安装 MySQL 8.4.11.LTS 版本
android·mysql·adb
海兰14 小时前
【数据库】tdsql(MySQL )的事务隔离级别
android·数据库·mysql