前言
今天同事买了一台一加8Pro,当然话不多说,先拿来给我们研究一下,看看一加是如何优化120Hz屏幕的。
一、1加7 Pro上90hz的优化方案
首先我们先来看看90hz上如何优化的,采用的主要方法就是动态调整整体屏幕帧率,进到不同应用,调整屏幕帧率,以下是我之前总结的整体帧率切换的场景。
我将它命名为:屏幕动态调整帧率
1.1 小结
设置当中有60hz和90hz模式选项 设置为90hz选项之后,正常界面可以一直保持90hz模式,进入特定的应用或界面自动切换到60hz,退出特定的应用或界面自动切换回90hz 特定的应用主要和游戏,视频,时间相关
二、1加8 Pro上120hz的优化方案
正当我也认为一加8 Pro上会采用和1加7 Pro类似的方案的时候。我抓了一个trace,让我看到了1加8 Pro的另外一种方案。
我将它命名为:应用动态调整帧率 (我相信一加已经申请了专利,如果没有申请,我觉得我得赶紧写一个)
2.1 先来看看trace
新浪微博
状态栏
可以很明显的看到在同一时间中,vsync信号按照120hz上报
新浪微博按照120hz绘制 状态栏按照60hz绘制
我猜这样子设计的原因是:用户在刷微博的时候,让其他窗口按照60hz绘制,可以让出更多cpu和gpu资源给微博用,保证用户刷微博保持120hz。
2.2 小结
我推测1加是可能在Choreographer中动了一些手脚,而且我自己大概也可以写出demo代码了,可以在不整体调整屏幕帧率的情况下,让不同应用以任何可以整除120的帧率运行,例如60,30,40hz,由于整体帧率又是120hz,也不会出现长短帧的方案。
三、总结
通过研究可以发现,一加在90hz和120hz采用了两种不同的方案,而且这两个方案是可以同时工作的。只不过同时运行的时候逻辑会比较复杂,暂时我还不确定1加8 Pro是否会采用两种方案同时使用?因为手机已经还给同事了。
不管是什么方案,最终目的一致的:就是让应用的每一帧绘制渲染时间小于一个时间周期。
四、技术更新
1.我初步了看了一下代码,发现R上新增的setFrameRate的作用主要是标记不同的layer的帧率,可以提升效率sf合成的时候,通过遍历可见的layer 例如发现在120hz的屏幕上所有的layer的帧数都是30,sf就只需要按照30hz去刷新。
2.如果控制每一个应用的vsync信号,达到一加8的效果,关键是要调用EventThread.setVsyncRate接口 这个接口之前就存在了,只是目前源码中没有在应用级别主动调用这个接口,这个接口的主要作用是让vsync信号按照你要的帧率上报给app 例如屏幕是120hz的,但是app希望是60hz,所以只需要setVsyncRate(60),就可以控制单个应用的vsync周期,可以是<屏幕的帧率的任何值,为了不产生长短帧,建议是屏幕帧率的约数。
3.但是上述两个调整都不会影响屏幕的config,但是1加手机进入到不同应用,会去整体的设置新的config到屏幕,例如120hz和60hz,或者90hz和60hz,如果有错误的欢迎纠正!!!