背景

我们很容易发现,现在小米等厂商支持高刷新率120Hz的手机,在系统设置中都隐藏了90Hz这个档位,只有60和120两种选项。对很多人来说,60虽然省电但是太不流畅,影响体验,120虽然流畅但太耗电,出门会有电量焦虑,折中的90其实才是最合适的选择(至少在心理上)。

image-20230227172559371

我一直试图搞清楚为什么厂商不愿意开放90Hz这个选项,对系统来说,刷新率无非就是一个可以修改的数值。是什么原因不让用户多一个选择呢?

调查

经过一些简单的查询,我发现网络上的解释一般都是硬件本身不支持,芯片功能较弱,不足以驱动多种刷新率,强制修改为90Hz长时间可能造成屏幕损坏等。

当然,我也不忘去问一问无所不知的ChatGPT,他还是一如既往地说了一些车轱辘话。他这个“技术退步”论倒是有点意思。

image-20230227170811351

其实“硬件不支持”这个说法我并不是很赞同。如果你在Android系统的开发者选项中打开“显示屏幕刷新率”的开关,就会发现在不同的使用场景下,不只有60Hz和120Hz两种刷新率,比如息屏AOD为了降低功耗,就只有30Hz;很多手游最高也只支持90Hz,即便开启120Hz也没用。因此,要是说强制修改为其他隐藏刷新率会导致屏幕损坏,我觉得是不太可能的,对那种本身就支持LTPO的设备就更不可能了。

此外,Android系统也给开发者提供了查询所支持刷新率的接口,通过接口返回的Mode数组得知具体的刷新率参数:

1
2
3
getSystemService(Context.WINDOW_SERVICE) as WindowManager).defaultDisplay.supportedModes.map {
it.refreshRate.toInt()
}

在我的小米13上,通过上述接口获取到的刷新率为[60, 90, 120],说明在系统看来是支持90Hz的。

开发

于是乎,我想开发一个小工具,既可以解锁90Hz刷新率,也可以在通知中心快捷地切换高低刷新率,免去每次都要去系统设置操作老半天的烦恼。

经过一番搜索,我发现在MIUI当中,要修改刷新率其实就是一行ADB命令的事情:

1
adb shell settings put secure miui_refresh_rate 90

此命令会修改系统Secure设置数据库,对非系统应用的开发者来说,通过官方SDK是没有办法直接修改的。但是,自从Android引入了无线ADB调试的功能之后,我们就可以配合Shizuku在应用内部执行adb shell命令了,相当于进行了免ROOT越权。

最终小工具的形态也很简单,一个快捷开关,一个简单的配置页面:

image-20230227210347006

image-20230227211124863

当然,我不会忘了开源:FpsSwitcher,你也可以在酷安下载到成品:MIUI 帧率开关