本文基于工作中自动背光笔记扩充了下,记录下自动背光算法。
基于 Android 8.1, 代码可参看 http://androidxref.com/8.1.0_…
Android 9 加入了所谓的机器学习算法,根据用户调节时亮度和光感重新生成曲线,
自动背光时的滑动条不再是调节 adjustment 值,暂时不想写了。。。
Android 10 简单看了下,加入了对单个应用的支持,暂时不想写了。。。
一、简单说说
简单的说,其实背光调节就三大步,建曲线,采样去抖,计算亮度
1. 建曲线
Brightness
1 ^
|
|
|。|。|。+。min+。|
0+--+---+-------------------> lux
min
建曲线这个其实就是建立一个 lux 对应的 brightness 的曲线,这样就可以根据光感传来的 lux 值,计算出对应的亮度为多少。
(安卓的算法需要 Brightness 比 lux 多一个值,所以上图曲线两者的 min 值不对应)
2. 采样去抖
这个就是采集一段时间内的 lux 值,然后根据这段时间的 lux, 算出这段时间的 lux 值。
当然考虑到抖动 (如有闪电等突然变化很大,然后又恢复的情况; 或者周期性的明暗明暗变化等情况),所以需要去抖,
默认安卓是要求光照稳定在 -0.8~+1.1 倍之间,并且持续一段时间(由暗到亮是 4 秒,由亮到暗是 8s)
3. 计算亮度
安卓的算法流程
1). 开自动背光时,下拉通知条为一系数,假设为 x, 其区间为[-1.0, 1.0], 应用层为除以 1024, 浮点精度
2). 计算背光时,先计算出 lux 对应的亮度,假设为 y, 其区间为[0.0, 1.0], 考虑为用户会微调,所以然后再处理用户微调(1 中的 x)
3). 最终计算屏幕亮度 z 向下取整
4). 然后再处理 z 的极值区间,例如我们设置的 11~255, 18~255
用公式表示即为
$$
\mathbf{z = y^{3^{-x}}*255, x\in[-1.0, 1.0], y\in[0.0, 1.0], z\in[min, 255]}
$$
公式中 3 表示为 gamma3.0, 后面是 3 的 - x 次方, 即 $3^{-x}$
举个例子,
/
出地库 光照稳定在 -0.8~1.1 倍之间 4S /
| | |/
+---------+-----------------------+--------------
10lux 5000lux 开始改变屏幕,假设屏幕亮度从 55 -> 255,
那么亮度调节完需要时间为((255-55)/rampRate)*16.6ms, 约 3.3S
(16.6ms 是一个 vsync 时间,rampRate 默认为 1,可以更改进行速率调节)