xDroid's Blog

屏幕背光的困惑

前言:我还没有彻底搞清楚原理,对这方面熟悉的同学我们可以讨论一下。

早在S210调教一文里,我就沮丧地指出了屏幕背光没有办法调节的问题。不仅仅是键盘上Fn快捷键没有办法直接调节,而是在设置选项->亮度与锁屏中也无法调节。

作为机智而勤奋的我,怎么会被这种区区的困难击退呢?于是依照网上给出的亮度调节方案,我写了一个调节亮度的脚本:

#!/bin/bash
read brightness < /sys/class/backlight/intel_backlight/brightness
read max < /sys/class/backlight/intel_backlight/max_brightness
echo "brightness $brightness"
echo "max $max"
echo `expr $max \* $1 \/ 100` >> /sys/class/backlight/intel_backlight/brightness

食用方法是

sudo br.sh 45

于是,开机输入两遍密码成为了日常怎么调节个亮度还要root密码摔!

后来发现一个问题其实几乎所有人都在犯这个错误。
我们知道人的感官接收信号给出的强度实际上是按对数增减的,但是像这种屏幕背光是按照线性(光子数目)增减的。这就导致看上去在低亮度区亮度变化太快,而高亮度区不怎么变化。
解决方案相当简单,只要用二次函数近似代替一下就行了:

#!/bin/bash
read brightness < /sys/class/backlight/intel_backlight/brightness
read max < /sys/class/backlight/intel_backlight/max_brightness
echo "brightness $brightness"
echo "max $max"
**echo `expr $max \* $1 \* $1 \/ 10000` >> /sys/class/backlight/intel_backlight/brightness**

就这样xDroid幸福快乐地过了一个学期。每天为了调整屏幕亮度输入五六次密码。

终于还是不耐其烦,于是写了一个脚本自动刷新键盘控制的屏幕亮度值,再写到驱动控制的值里面,每秒刷新一次,代码如下:

#!/bin/bash
read max < /sys/class/backlight/intel_backlight/max_brightness
while true
do
    brightnesspath="/sys/class/backlight/ideapad/brightness"
    if [ -f $brightnesspath ]
    then
        read br < /sys/class/backlight/ideapad/brightness
    else
        sleep 1
        continue
    fi
    echo `expr $max \* $br \* $br \/ 100` >> /sys/class/backlight/intel_backlight/brightness
    sleep 1
done

然后写入到rc.local里面去,实现开机自启。

xDroid还没幸福快乐地使用上一个月,又因为另一件突如其来的事情打破了生活的平静。百般无奈下安装Ubuntu 15.10,之后又是各种优化调整。起初第一次进入系统的时候能调节屏幕亮度了,大喜,认为是驱动什么的bug修好了;不料过了一天又没有办法用Fn键调亮度了。仔细想了想,只有可能是grub引导参数配置的问题(事实证明这大概是一个flag)。

笔记本使用Ubuntu系统关闭独显+省电降温设置一文中,提到intel的HD系列显卡可以通过开启自动调节选项达到省电的效果。本来也并不懂这些选项是什么意思,便感到很可疑,cat出来看了一下:

pcie_aspm=force i915.semaphores=1 acpi_osi=Linux acpi_backlight=vendor elevator=noop i915.i915_enable_rc6=1 i915.i915_enable_fbc=1 i915.lvds_downclock=1

按理说acpi_backlight这里设置为vendor是正确的,意即读取制造商文件的设置。然而这些选项导致没有办法调节亮度了。

试了一下,删掉大部分,剩下几个选项:

pcie_aspm=force acpi_osi=Linux i915.i915_enable_rc6=1

就能好好地调整亮度了。于是xDroid又幸福快乐地写了几天代码。

前方打脸高能
今天当我正要得出“那些网站抄来抄去设置又抄错”这样结论的时候,抱着一丝侥幸的心态又google了一下,发现很多关于Ubuntu下显卡优化的文章都说到同一个文件/usr/share/X11/xorg.conf.d/20-intel.confcat了一下,发现居然没有这个文件——没有就没有了呗,写一个总行吧——重启以后就可以用那个很多参数的引导项后调节亮度了。
看来是缺少20-intel.conf咯?

突然想到那堆设置里面有一个elevator。显卡节电/优化和调度器有什么关系?折腾了一下三种不同的调度器(默认是deadline),只有noop启用的时候才能达到上面的效果。
顺便说一句,查看当前磁盘调度器可以使用以下命令魔法

cat /sys/block/sda/queue/scheduler

前方再次打脸
令人感到抓狂的是,就当我认为这样设置无误后,启动了一次试了一下——咦,怎么还是不能调节?sudo reboot……咦,怎么迷之好了?……反复确认了两三次都是这样。
接下来需要做的事情就是比较先行设置下显卡性能有没有提升——换而言之,有没有节省电力同时有合理的I/O性能(noop对于机械硬盘简直……)。


2016.02.17更新
今天该收拾一下拖延症了……把优化选项开启和关闭的情况做了一下跑分测试;然而并没有什么很大的区别……所以我大概会把优化参数去掉吧。

opts-on opts-off

render-bench

(渲染时间,越小越好)

 ![](/images/2016-02-confused-by-backlight/opts-on-1.jpg) ![](/images/2016-02-confused-by-backlight/opts-off-1.jpg)

gputest

(得分,越大越好)

 ![](/images/2016-02-confused-by-backlight/opts-on-2.jpg) ![](/images/2016-02-confused-by-backlight/opts-off-2.jpg)
这是系统情况: 启动参数:
quiet splash pcie_aspm=force i915.semaphores=1 acpi_osi=Linux acpi_backlight=vendor elevator=noop i915.i915_enable_rc6=1 i915.i915_enable_fbc=1 i915.lvds_downclock=1
![](/images/2016-02-confused-by-backlight/systems-opts-on.jpg)

启动参数:

quiet splash pcie_aspm=force i915.semaphores=1 acpi_osi=Linux i915.i915_enable_rc6=1