屏幕亮度自动调节的实现


以下文章转载自:http://www.miui.com/thread-27347-1-1.html

当在论坛上看到很多机友反映G7的自动亮度太暗,石头的自动亮度太亮的时候,MIUI小组准备做自动亮度的优化工作,着眼点就是增加自动亮度可调节功能。回首过往,一开始开发人员对自动亮度可调节功能的实现过于乐观,觉得应该很容易实现。深入下去发现这里面还是有不少陷阱和曲折的。


自动亮度的原理很简单:手机中有一个光源感应器,系统根据光源感应器的感光强度来调整屏幕亮度。问题的关键点在于对于某个感光强度,什么屏幕亮度是合适的。

首先看一下原生系统的实现,系统中有一张预设的表(以G7为例)

感光强度
屏幕亮度
[0, 200)
25
[200, 400)
55
[400, 1000)
70
[1000, 3000)
90
[3000, 无穷大)
250

当感光强度的值位于某个区间的时候,屏幕亮度为该区间对应的值。举例来说,当感光强度为800时,查表位于[400, 1000)这个区间,相对应的屏幕亮度为70。

并且在原生系统的实现中,屏幕亮度是只变亮不变暗。系统中维护一个当开启屏幕后感光强度的最大值,屏幕亮度始终保持在这个最大值对应的屏幕亮度。只有当关闭屏幕后,才重新开始计算最大值。这就是为什么大家发觉到暗处后屏幕并不会自动变暗,而是要关闭屏幕后再开启屏幕才能自动变暗。

用一句话来总结原生系统的实现,就是很黄很暴力。

接着调查一下CM的实现,CM的中有很多和自动亮度相关的设置,但是最关键的一项设置就是允许用户去定制系统预设的表。
用户可以任意去修改感光强度的区间范围以及个数,以及某个区间对应的自动亮度。以下表为例:

感光强度
屏幕亮度
[0, 200)
25
[200, 400)
55
[400, 1000)
70
[1000, 3000)
120
[3000, 无穷大)
250

用户修改[1000, 3000)这一区间对应的屏幕亮度为120.此后当感光强度位于这一区间时,屏幕亮度的值始终为120。

对于屏幕只变量不变暗的问题,CM也提供了相应的设置,使得一段时间内,屏幕可以自动变暗,这一点我会在下面MIUI的实现中详细展开。

用一句话来总结CM系统的实现,就是很好很强大。

最后回归到MIUI的实现,首先必须提到MIUI的一个宗旨“易用,人性化"。我们在开始设计自动亮度的时候也是围绕这个宗旨而来的。CM的确提供了最详细的设置和最完备的功能,一切交给用户。但是我们认为绝大多数小白用户不知道如何去使用这些,甚至很难理解这些功能是干嘛的,过于复杂。我们希望能够提供一个解决方案,即缺省的自动亮度能够满足绝大多数用户的需求,同时有一个简单的方式使得用户可以调节。这个简单的方式就像用户调节手动亮度一样。我们的实现大略是:

(1)在MIUI中,我们采用了一个理论模型,这个模型是感光强度的平方根和屏幕亮度成线性关系。
brightness_model.jpg  

如上图所示,X轴是亮度,Y轴是感光强度的平方根,其中当感光强度值为10000(平方根值为100)对应的屏幕亮度为255,0对应了0。在这之间的满足一个线性关系,比如说如果感光强度值为6400(平方根值为80),计算出的屏幕亮度为200。在1.14的版本中我们的模型与此稍有出入,当时我们是先获取光源感应器能感应的最大感光强度,这个最大值对应了最高屏幕亮度。对于N1和G7,这个值是10240。对于MS,这个值是27000。这样对于MS来说,缺省的自动亮度会偏暗。后来查阅相关资料修正为这个模型,一般来说在白天日光照射下感光强度为10000左右,这个强度应该对应屏幕最亮,当超过这个强度后,屏幕一直保持最亮。

(2)采用了这个模型后,还提供用户在设置中调节当前感光强度对应的亮度,比如说当前感光强度为6400,亮度修改为220,我们的模型就变化成为:

brightness_model2.jpg  

原有的一条直线变成两个线段,这样当以后感光强度为6400时,亮度就自动为220。其它的感光强度也相应的加以修正。有了这个模型,我们很是兴奋,哈,这下我们可以真正的自动亮度了,感光强度一变化,我们的亮度就能跟着变化。很快,我们被光源感应器这个硬件泼了个透心凉。
光源感应器是非常敏感的,当你轻轻的晃动一下手机或者头往前凑点,感光强度马上改变,这样我们的屏幕就会忽亮忽暗。这是无法忍受的,这个时候明白了为啥原生系统只变亮不变暗了,就是为了防止这个情况的发生。

(3)这个时候,我们必须找到一个既可变亮也可变暗,同时不能让我们的屏幕亮度变来变去的办法。一开始的想法很简单,当发现感光强度变化比较大的时候,我们就开始变暗。但是这个想法也被证实太天真了,我们的光源感应器实在太脆弱了,哪怕在室内开着灯的情况下,当把手机翻转过来的时候,感光强度为10,这个强度一般是非常暗的环境下的感光强度。这样的话,手机屏幕亮度还是会变来变去,在咨询光源感应器的生产厂商得知这个在硬件中变化就是这样,无法改变。我们采取了一个折衷的方案,在一段时间内,我们开始采样,记录感光强度所有的变化值,
如果在这段时间内,所有记录的感光强度值都比较低,屏幕会开始自动变暗。对于到更亮的环境下,原理是一样的,这样我们可以防止屏幕亮度的突变。CM提供设置让用户是否采样,采样的持续时间是多长,采样的间隔是多久。我们采用了3秒作为采样时间,并且根据感光强度的变化自动调节采样间隔。经过测试,加上亮度可调节,应该能在避免复杂设置的情况下满足要求。一个看似简单问题的背后并不简单。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值