背光曲线的创建

https://i-blog.csdnimg.cn/direct/310a8e924973455995983b8a82b881e5.png

背光曲线

基本概念

环境光(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 值不同)

需求目标

  1. 功能需求
    • 建立从 环境光(Lux)手机屏幕亮度(Nit) 的映射关系(即背光曲线)。
    • 由于屏幕材质固定(R 恒定),代码实现时需简化为:
      sensor 上报的 Lux→ 背光等级(BL)
  2. 简化逻辑
    • 忽略环境光到 sensor 上报值的转换误差,认为 sensor 上报的 Lux = 环境光 Lux
    • 最终代码需实现: sensor 上报 Lux → 目标屏幕亮度(Nit) → 背光等级(BL)

与之对应的系统给出来的配置接口:

1
2
3
4
config_autoBrightnessLevels ----Lux
config_autoBrightnessDisplayValuesNits ---- DisplayNit(目标屏幕亮度)
config_screenBrightnessNits —> Nit
config_screenBrightnessBacklight —> 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_screenBrightnessNitsconfig_screenBrightnessBacklight 创建两条映射曲线:

  1. Nit-Backlight 曲线 :将屏幕亮度(Nit)映射到背光亮度(Backlight)。
  2. Backlight-Nit 曲线 :将背光亮度(Backlight)映射到屏幕亮度(Nit)。

这两条曲线是互逆的,用于在 Nit 和 Backlight 之间进行转换。

输出:

  • Nit-Backlight 曲线和 Backlight-Nit 曲线。

创建 Lux-Nit 曲线

输入

  • config_autoBrightnessDisplayValuesNit :自动亮度调节的目标屏幕亮度(Nit)配置值。
  • config_autoBrightnessLevels :自动亮度调节的环境光照度(Lux)配置值。
  • 用户设置的(Lux,Backlight)对:用户手动调整亮度时保存的(Lux ,Backlight) 对

过程:

  1. config_autoBrightnessDisplayValuesNit 映射为 Backlight
    • 使用 Nit-Backlight 曲线,将 config_autoBrightnessDisplayValuesNit 中的 Nit 值映射为对应的 Backlight 值。
    • 得到一个 Backlight 数组,与 config_autoBrightnessLevels 中的 Lux 数组一一对应。
  2. 插入用户设置的(Lux,Backlight)对
    • 将用户手动设置的(Lux,Backlight)对插入到 config_autoBrightnessLevels 和 Backlight 数组中。
    • 插入逻辑通常是根据 Lux 值的大小进行排序,并确保 Lux 和 Backlight 的对应关系正确
    • 在实际操作中插入数据时涉及到所有 Backlight 的调整,涉及 adjustment 自动背光调整值.。具体逻辑在源码中分析
  3. 生成 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 最大,符合期望

https://i-blog.csdnimg.cn/direct/310a8e924973455995983b8a82b881e5.png

0%