VSync-offset/duration
虚拟化后的VSync还有一个好处,就是可以对VSync进行一些定制操作,offset就是其中之一。
接下来就是offset的定义,offset 分为两大类,即phase-app和phase-sf:
phase-app:VSync-app与hw_vsync的相位差;
phase-sf:VSync-sf与hw_vsync的相位差;
还是以trace为例,可以看到,每一个vsync-app都比对应的TE信号晚了1.2ms,因此这份trace中的app-offset为+1200000(ns为单位)
同样的,每一个vsync-sf都比对应的TE早了3.6ms,因此sf-offset即为-3600000.
综上,offset表示着vsync-app及vsync-sf与hw_vsync的相位差,这个值通过dump sf就可以获取。
Offset 的一个比较难以确定的点就在于 Offset 的时间该如何设置,其优缺点是动态的,与机型的性能和使用场景有很大的关系。
如果 Offset 配置过短,那么可能 App 收到 Vsync-App 后还没有渲染完成,SurfaceFlinger 就收到 Vsync-SF开始合成,那么此时如果 App 的 BufferQueue 中没有之前累积的 Buffer,那么 SurfaceFlinger 这次合成就不会有 App的东西在里面,需要等到下一个 Vsync-SF 才能合成这次 App 的内容,时间相当于变成了 Vsync 周期+Offset,而不是我们期待的Offset。
如果 Offset 配置过长,就没有办法起到其原有的作用了。
另外,稍微错开app和sf的VSync是有好处的,因为错开后整个系统同一时间抢占CPU的task会减少,理论上会有点优化。一般安卓对不同帧率有不同的offset默认配置。
在Android S及之后的版本,Google引入了duration的概念,部分程度上代替了offset。
duration的定义相对明确
app duration:app绘制一块buffer到sf消费这块buffer的时长(vsync-app与对应vsync-sf的间隔);
sf duration:sf消费一块buffer到这块buffer上屏的时长(vsync-sf到TE的间隔);
也就是说,app duration和sf duration之和,即为某一帧从开始绘制到刷新在屏幕上的总时长。
这种表示相对直观,因此在S版本及之后,google默认采用配置duration的方式来决定vsync相位差,但这并不代表offset被弃用,这两个值是相互影响的,修改其中一个值,另外一个值也会出现变化。具体的换算关系为
app phase=n * vsync period - (app duration + sf duration)
sf phase = m * vsync period - sf duration
从duration的概念可以看出,duration越短,给到app绘制和sf合成的时间就越有限,那么绘制线程和sf线程所需的CPU,GPU频率就越高,功耗就越高。
duration的长短会影响一个buffer从绘制到上屏的生命周期,进而影响到跟手性,duration越短,跟手性越强。其次,duration的配置会影响bufferqueue里预先加载的buffer块数量,进而影响sf占用的内存大小,duration越长,buffer块数量越多,sf占用内存越大。另外,厂商对CPU和GPU的调频策略也会受到duration的影响,贸然改短duration可能会导致特定场景的频率异常升高。
讲了这么多,总结起来Andriod中VSync模块的架构就是下图这样:
HW_VSync是由屏幕产生的脉冲信号,用来控制屏幕的刷新。
VSync-app与VSync-sf统称为软件VSync,它们是由SurfaceFlinger通过模拟硬件VSync而产生的VSync信号量,再分发给app和sf用来控制它们的合成节奏。
-
Android
+关注
关注
12文章
3921浏览量
127084 -
软件
+关注
关注
69文章
4731浏览量
87115 -
线程
+关注
关注
0文章
504浏览量
19638
发布评论请先 登录
相关推荐
评论