VSync offset定义的方法

描述

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为单位)

Android

同样的,每一个vsync-sf都比对应的TE早了3.6ms,因此sf-offset即为-3600000.

Android

综上,offset表示着vsync-app及vsync-sf与hw_vsync的相位差,这个值通过dump sf就可以获取。

Android

Offset 的一个比较难以确定的点就在于 Offset 的时间该如何设置,其优缺点是动态的,与机型的性能和使用场景有很大的关系。

如果 Offset 配置过短,那么可能 App 收到 Vsync-App 后还没有渲染完成,SurfaceFlinger 就收到 Vsync-SF开始合成,那么此时如果 App 的 BufferQueue 中没有之前累积的 Buffer,那么 SurfaceFlinger 这次合成就不会有 App的东西在里面,需要等到下一个 Vsync-SF 才能合成这次 App 的内容,时间相当于变成了 Vsync 周期+Offset,而不是我们期待的Offset。

如果 Offset 配置过长,就没有办法起到其原有的作用了。

Android

另外,稍微错开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之和,即为某一帧从开始绘制到刷新在屏幕上的总时长。

Android

这种表示相对直观,因此在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用来控制它们的合成节奏。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分