了解 Android VSYNC 信号的必要性

Understanding necessity of Android VSYNC signals

我试图更好地了解 Android 显示子系统,但仍然让我感到困惑的一个项目是如何处理 VSYNC 信号,以及为什么首先存在这么多信号。

Android 的设计核心是使用 VSYNC,但它使用了多个 VSYNC 信号。通过 "VSYNC Offset" 部分中的 https://source.android.com/devices/graphics/implement.html,有一个流程图,其中绘制了三个 VSYNC 信号:HW_VSYNC_0、VSYNC 和 SF-VSYNC。我知道 HW_VSYNC 用于更新 DispSync 中的时间,应用程序和 surfaceflinger 使用 VSYNC 和 SF-VSYNC,但为什么这些单独的信​​号是必需的?此外,偏移如何影响这些信号?是否有任何地方的时序图可以更好地解释这一点?

感谢您提供的任何帮助。

要理解这些东西,最好从 System-Level Graphics Architecture 文档开始,特别注意 The Need for Triple-Buffering 部分和相关图表(理想情况下是动画 GIF)。开头的句子 "If the app starts rendering halfway between VSYNC signals" 专门讨论 DispSync。阅读完后,希望设备图形文档的 DispSync 部分更有意义。

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

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

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

如果您尝试跟踪触摸输入,也许是在用户手指下移动地图,任何延迟都会被用户视为缓慢的触摸响应。目标是最小化延迟以改善用户体验。假设我们稍微延迟了事件,所以应用程序在 V0.5 绘制,我们在 V1.2 合成,然后切换到 V2 的显示。通过偏移应用程序和 SF activity,我们将总延迟从 2 帧减少到 1.5,如下所示。

这就是 DispSync 的用途。在您链接的页面上的反馈图中,HW_VSYNC_0 是物理显示的硬件刷新,VSYNC 导致应用程序呈现,SF_VSYNC 导致 SurfaceFlinger 执行合成。将它们称为 "VSYNC" 有点用词不当,但在 LCD 面板上将任何东西称为 "VSYNC" 可能是用词不当。

反馈回路图中提到的"retire fence timestamps"指的是巧妙的优化。由于我们没有在实际硬件 VSYNC 上做任何工作,如果我们关闭刷新信号,我们可以稍微更有效率。 DispSync 代码将改为使用 retire fences 中的时间戳(这是一个完整的其他讨论)来查看它是否不同步,并且将暂时 re-enable 硬件信号直到它回到正轨。

编辑: 您可以看到 Nexus 5 boardconfig 中的值是如何配置的。请注意 VSYNC_EVENT_PHASE_OFFSET_NSSF_VSYNC_EVENT_PHASE_OFFSET_NS.

的设置