我试图更好地了解Android显示子系统,但有一点仍然让我感到困惑,那就是VSYNC信号是如何处理的,以及为什么会有这么多信号存在。
Android被设计为在其核心使用VSYNC,但它使用了多个VSYNC信号。通过“垂直同步偏移”部分中的https://source.android.com/devices/graphics/implement.html,有一个流程图,它描绘了三个垂直同步信号: HW_VSYNC_0、垂直同步和SF-垂直同步。我知道HW_VSYNC是用来更新DispSync中的计时的,应用程序和signals signals使用了VSYNC和SF-VSYNC,但是为什么这些单独的信号是必要的呢?此外,偏移量是如何影响这些信号的?有没有能更好地解释这一点的时序图?
感谢你能提供的任何帮助。
发布于 2015-01-15 01:27:15
要理解这些东西,最好从System-Level Graphics Architecture文档开始,特别注意需要三重缓冲部分和相关的图表(理想情况下是一个动画的GIF)。开头的一句话,“如果应用程序在垂直同步信号之间开始渲染”是专门讨论DispSync的。一旦你读完了,希望设备图形文档的DispSync部分更有意义。
大多数设备没有配置DispSync偏移量,因此实际上只有一个垂直同步信号。在下面的内容中,我假设启用了DispSync。
硬件仅提供对应于主显示器刷新的一个VSYNC信号。其他由SurfaceFlinger DispSync代码在软件中生成,以实际垂直同步的固定偏移量触发。一些聪明的软件被用来防止时间不同步。
这些信号用于触发SurfaceFlinger合成和应用渲染。如果您遵循架构文档中的部分,您可以看到,这在应用程序呈现其内容和内容出现在屏幕上之间建立了两个延迟帧。可以这样想:给定三次VSYNC,应用程序在V0上绘制,系统在V1上进行合成,合成后的帧被发送到V2上的显示器。
如果你试图跟踪触摸输入,比如在用户的手指下移动地图,任何延迟都会被用户视为缓慢的触摸响应。目标是最大限度地减少延迟,以改善用户体验。假设我们稍微延迟了事件,所以应用程序在V0.5上绘制,我们在V1.2上合成,然后切换到V2上的显示。通过抵消app和SF活动,我们将总延迟从2帧减少到1.5帧,如下所示。

这就是DispSync的作用。在您链接的页面的反馈图中,HW_VSYNC_0是物理显示的硬件刷新,VSYNC导致应用呈现,SF_VSYNC导致SurfaceFlinger执行合成。将它们称为"VSYNC“有点用词不当,但在LCD面板上将任何东西称为"VSYNC”可能是一个用词不当。
反馈循环图中注明的“退出围栏时间戳”指的是一种巧妙的优化。因为我们没有在实际的硬件VSYNC上做任何工作,所以如果我们关闭刷新信号,我们可以稍微提高效率。相反,DispSync代码将使用退休栅栏的时间戳(这完全是另一回事)来查看它是否失去了同步,并将临时重新启用硬件信号,直到它回到正轨。
编辑:您可以看到这些值是如何在Nexus 5 boardconfig中配置的。请注意VSYNC_EVENT_PHASE_OFFSET_NS和SF_VSYNC_EVENT_PHASE_OFFSET_NS的设置。
https://stackoverflow.com/questions/27947848
复制相似问题