17

I'm trying to get a better understanding of the Android display subsystem, but one item that's still confusing to me is how VSYNC signals are handled, and why so many exist in the first place.

Android is designed to use VSYNC at its core, but there are multiple VSYNC signals that it employs. Via https://source.android.com/devices/graphics/implement.html in the "VSYNC Offset" section, there is a flow diagram which diagrams three VSYNC signals: HW_VSYNC_0, VSYNC, and SF-VSYNC. I understand that HW_VSYNC is used to update the timing in DispSync, and that VSYNC and SF-VSYNC are used by the apps and surfaceflinger, but why are these individual signals necessary at all? Furthermore, how do the offsets impact these signals? Is there a timing diagram available anywhere which better explains this?

Thanks for any help you can offer.

4

1 回答 1

30

要理解这些内容,最好从系统级图形架构文档开始,特别注意“需要三重缓冲”部分和相关图表(理想情况下应该是动画 GIF)。开头的那句话“如果应用程序在 VSYNC 信号之间开始渲染”是专门针对 DispSync 的。读完之后,希望设备图形文档的 DispSync 部分更有意义。

大多数设备没有配置 DispSync 偏移,因此实际上只有一个 VSYNC 信号。在接下来的内容中,我假设 DispSync 已启用。

硬件只提供一个 VSYNC 信号,对应主显示刷新。其他的由 SurfaceFlinger DispSync 代码在软件中生成,以与实际 VSYNC 的固定偏移量触发。一些聪明的软件被用来防止时间错位。

这些信号用于触发 SurfaceFlinger 组合和应用程序渲染。如果您按照架构文档中的部分进行操作,您会看到这在应用程序呈现其内容和内容出现在屏幕上之间建立了两帧延迟。可以这样想:给定 3 次 VSYNC,应用程序在 V0 绘制,系统在 V1 进行合成,合成的帧在 V2 发送到显示器。

如果您尝试跟踪触摸输入,可能在用户手指下移动地图,任何延迟都会被用户视为缓慢的触摸响应。目标是最小化延迟以改善用户体验。假设我们稍微延迟了事件,所以应用程序在 V0.5 绘制,我们在 V1.2 合成,然后在 V2 切换到显示。通过抵消应用程序和 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

于 2015-01-14T17:27:15.123 回答