背光曲线的创建
背光曲线
基本概念
环境光(Ambient Light)
- 真实环境的光照强度,单位 Lux (如白天室外约 10,000 Lux,夜间室内约 50 Lux)。
- 手机通过 光感传感器(sensor) 检测环境光,但 sensor 上报值 ≤ 真实环境光值(受硬件精度限制)。
Lux: 光照度单位,从光源照射到单位面积上的光通量
在背光流程中,Lux 通常指的是环境光 传感器 检测到的环境光强度。
背光(Backlight, BL)
- 屏幕背后的光源强度,由系统通过驱动控制,取值范围通常为 0-255 (如 0 为最低背光,255 为最高背光)。
- 背光是硬件参数,直接影响屏幕亮度,但需通过屏幕材质(反射系数 R)才能体现为用户感知的亮度。
手机屏幕亮度(Nit)
- 用户实际感知的屏幕亮度,单位 Nit (如 100 Nit 适合室内使用,500 Nit 适合户外强光)。
- 由背光强度和屏幕材质共同决定,公式为:
Nit = R× 背光强度(BL)
其中, R 为反射系数 (由屏幕材质决定,如 OLED 和 LCD 的 R 值不同)
需求目标
- 功能需求
- 建立从 环境光(Lux) 到 手机屏幕亮度(Nit) 的映射关系(即背光曲线)。
- 由于屏幕材质固定(R 恒定),代码实现时需简化为:
sensor 上报的 Lux→ 背光等级(BL)
- 简化逻辑
- 忽略环境光到 sensor 上报值的转换误差,认为 sensor 上报的 Lux = 环境光 Lux 。
- 最终代码需实现: sensor 上报 Lux → 目标屏幕亮度(Nit) → 背光等级(BL) 。
与之对应的系统给出来的配置接口:
| |
解释一下这几个参数
config_screenBrightnessNits 和 config_screenBrightnessBacklight 反应的应该是屏幕材质,也就是背光和屏幕亮度的关系(L = R*E)中的 R,在硬件不变的情况下这两个参数配置好后不应该去改变,这两个参数定义的是背光等级到屏幕亮度的硬件特性。
config_autoBrightnessLevels 和 config_autoBrightnessDisplayValuesNits 。一般修改背光曲线配置的是这两个值,这两个属性定义的是环境光到屏幕亮度(背光等级)的策略。
背光曲线的创建
这里假设配置的数据都是有效的过一遍创建流程:
创建 Nit-Backlight 和 Backlight-Nit 曲线用于反应屏幕的R反射系数属性
输入 :
config_screenBrightnessNits:屏幕亮度(Nit)的配置值。config_screenBrightnessBacklight:背光亮度(Backlight)的配置值。
过程 :
根据 config_screenBrightnessNits 和 config_screenBrightnessBacklight 创建两条映射曲线:
- Nit-Backlight 曲线 :将屏幕亮度(Nit)映射到背光亮度(Backlight)。
- Backlight-Nit 曲线 :将背光亮度(Backlight)映射到屏幕亮度(Nit)。
这两条曲线是互逆的,用于在 Nit 和 Backlight 之间进行转换。
输出:
Nit-Backlight曲线和Backlight-Nit曲线。
创建 Lux-Nit 曲线
输入 :
config_autoBrightnessDisplayValuesNit:自动亮度调节的目标屏幕亮度(Nit)配置值。config_autoBrightnessLevels:自动亮度调节的环境光照度(Lux)配置值。- 用户设置的(Lux,Backlight)对:用户手动调整亮度时保存的(Lux ,Backlight) 对
过程:
- 将
config_autoBrightnessDisplayValuesNit映射为 Backlight :- 使用
Nit-Backlight曲线,将config_autoBrightnessDisplayValuesNit中的 Nit 值映射为对应的 Backlight 值。 - 得到一个 Backlight 数组,与
config_autoBrightnessLevels中的 Lux 数组一一对应。
- 使用
- 插入用户设置的(Lux,Backlight)对 :
- 将用户手动设置的(Lux,Backlight)对插入到
config_autoBrightnessLevels和 Backlight 数组中。 - 插入逻辑通常是根据 Lux 值的大小进行排序,并确保 Lux 和 Backlight 的对应关系正确
- 在实际操作中插入数据时涉及到所有 Backlight 的调整,涉及 adjustment 自动背光调整值.。具体逻辑在源码中分析
- 将用户手动设置的(Lux,Backlight)对插入到
- 生成
Lux-Nit曲线 :- 使用
Backlight-Nit曲线,将 Backlight 数组转换为 Nit 值。 - 最终生成
Lux-Nit曲线,表示从环境光照度(Lux)到目标屏幕亮度(Nit)的映射关系。
- 使用
输出 :
Lux-Nit曲线。
使用 Lux-Nit 曲线进行自动亮度调节
当环境光传感器检测到当前的 Lux 值时:
- 根据
Lux-Nit曲线,查找对应的 目标Nit 值。 - 使用
Nit-Backlight曲线,将 Nit 值转换为 Backlight 值。(背光强度=L/R) - 将 Backlight 值传递给底层硬件,调整屏幕背光亮度。
插入用户设置的(Lux,Backlight)对时 adjustment 自动背光调整值的设置及使用
在上述流程中插入用户设置的(Lux,Backlight)对时并不只是在曲线中改变点即可,而是要调整整个lux —backlight对应关系。也就是要调整整个backlight数组。这里的调整逻辑就是通过adjustment 实现
adjustment: 自动背光调整值,范围(-1,1)
具体调整逻辑:
计算gamma
gamma = log [current] desired
current: 当前值(通过当前已经存在的曲线由lux得到的BL) ,desired: 期望值(用户设置) 范围 0 到 1 0 最暗,1 最亮
计算adjustment
adjustment =-log [maxGamma] gamma
maxGamma 是一个用于描述屏幕亮度曲线的参数,它影响屏幕亮度的非线性映射.简而言之是一个配置属性
中间当 current 和 desired 是一些特殊值时 adjustment 直接设置,这也是adjustment存在的意义.
current <=0.1f || current> = 0.9f 时 adjustment = desired-current;
desired = 0 时 adjustment =-1
desired = 1 时 adjustment = 1
重新计算gamma
gamma = maxGamma^(-adjustment)
计算新的背光数组
newBacklight = oldBacklight^gamma
y = a^x (0< a < 1) x 越大 y 越小
最终映射关系, adjustment 只是一个中间值,最终用于该表Backlight的是 gamma。
desired = 0 时 adjustment =-1 ,此时 gamma = maxGamma 最大,newBacklight = oldBacklight^maxGamma 最小,符合期望 desired = 1 时 adjustment = 1 ,此时 gamma = maxGamma^-1 最小,newBacklight = oldBacklight^maxGamma 最大,符合期望
