发布网友 发布时间:2024-01-06 19:16
共1个回答
热心网友 时间:2024-04-09 22:02
自动亮度的原理很简单:手机中有一个光源感应器,系统根据光源感应器的感光强度来调整屏幕亮度。问题的关键点在于对于某个感光强度,什么屏幕亮度是合适的。
首先看一下原生系统的实现,系统中有一张预设的表(以G7为例)
当感光强度的值位于某个区间的时候,屏幕亮度为该区间对应的值。举例来说,当感光强度为800时,查表位于[400, 1000)这个区间,相对应的屏幕亮度为70。
并且在原生系统的实现中,屏幕亮度是只变亮不变暗。系统中维护一个当开启屏幕后感光强度的最大值,屏幕亮度始终保持在这个最大值对应的屏幕亮度。只有当关闭屏幕后,才重新开始计算最大值。这就是为什么大家发觉到暗处后屏幕并不会自动变暗,而是要关闭屏幕后再开启屏幕才能自动变暗。
用一句话来总结原生系统的实现,就是很黄很暴力。
接着调查一下CM的实现,CM的中有很多和自动亮度相关的设置,但是最关键的一项设置就是允许用户去定制系统预设的表。
用户可以任意去修改感光强度的区间范围以及个数,以及某个区间对应的自动亮度。以下表为例:
用户修改[1000, 3000)这一区间对应的屏幕亮度为120.此后当感光强度位于这一区间时,屏幕亮度的值始终为120。
对于屏幕只变量不变暗的问题,CM也提供了相应的设置,使得一段时间内,屏幕可以自动变暗,这一点我会在下面MIUI的实现中详细展开。
用一句话来总结CM系统的实现,就是很好很强大。
最后回归到MIUI的实现,首先必须提到MIUI的一个宗旨“易用,人性化"。在开始设计自动亮度的时候也是围绕这个宗旨而来的。CM的确提供了最详细的设置和最完备的功能,一切交给用户。但是一般认为绝大多数小白用户不知道如何去使用这些,甚至很难理解这些功能是干嘛的,过于复杂。希望能够提供一个解决方案,即缺省的自动亮度能够满足绝大多数用户的需求,同时有一个简单的方式使得用户可以调节。这个简单的方式就像用户调节手动亮度一样。实现大略是:
(1)在MIUI中,采用了一个理论模型,这个模型是感光强度的平方根和屏幕亮度成线性关系。
如上图所示,X轴是亮度,Y轴是感光强度的平方根,其中当感光强度值为10000(平方根值为100)对应的屏幕亮度为255,0对应了0。在这之间的满足一个线性关系,比如说如果感光强度值为6400(平方根值为80),计算出的屏幕亮度为200。在1.14的版本中模型与此稍有出入,当时是先获取光源感应器能感应的最大感光强度,这个最大值对应了最高屏幕亮度。对于N1和G7,这个值是10240。对于MS,这个值是27000。这样对于MS来说,缺省的自动亮度会偏暗。后来查阅相关资料修正为这个模型,一般来说在白天日光照射下感光强度为10000左右,这个强度应该对应屏幕最亮,当超过这个强度后,屏幕一直保持最亮。
(2)采用了这个模型后,还提供用户在设置中调节当前感光强度对应的亮度,比如说当前感光强度为6400,亮度修改为220,模型就变化成为:
原有的一条直线变成两个线段,这样当以后感光强度为6400时,亮度就自动为220。其它的感光强度也相应的加以修正。有了这个模型,可以真正的自动亮度了,感光强度一变化,亮度就能跟着变化。
光源感应器是非常敏感的,当轻轻的晃动一下手机或者头往前凑点,感光强度马上改变,这样屏幕就会忽亮忽暗。这是无法忍受的,这个时候明白了为啥原生系统只变亮不变暗了,就是为了防止这个情况的发生。
(3)这个时候,必须找到一个既可变亮也可变暗,同时不能让屏幕亮度变来变去的办法。一开始的想法很简单,当发现感光强度变化比较大的时候,就开始变暗。但是这个想法也被证实太天真了,光源感应器实在太脆弱了,哪怕在室内开着灯的情况下,当把手机翻转过来的时候,感光强度为10,这个强度一般是非常暗的环境下的感光强度。这样的话,手机屏幕亮度还是会变来变去,在咨询光源感应器的生产厂商得知这个在硬件中变化就是这样,无法改变。采取了一个折衷的方案,在一段时间内,开始采样,记录感光强度所有的变化值,如果在这段时间内,所有记录的感光强度值都比较低,屏幕会开始自动变暗。对于到更亮的环境下,原理是一样的,这可以防止屏幕亮度的突变。CM提供设置让用户是否采样,采样的持续时间是多长,采样的间隔是多久。采用了3秒作为采样时间,并且根据感光强度的变化自动调节采样间隔。经过测试,加上亮度可调节,应该能在避免复杂设置的情况下满足要求。一个看似简单问题的背后并不简单。