【问题标题】:Understanding necessity of Android VSYNC signals了解 Android VSYNC 信号的必要性
【发布时间】:2015-01-14 16:31:30
【问题描述】:

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

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

感谢您提供的任何帮助。

【问题讨论】:

    标签: android android-5.0-lollipop android-4.4-kitkat vsync surfaceflinger


    【解决方案1】:

    要了解这些内容,最好从System-Level Graphics Architecture 文档开始,特别注意需要三重缓冲部分和相关图表(理想情况下应该是动画 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_NSSF_VSYNC_EVENT_PHASE_OFFSET_NS 的设置。

    【讨论】:

    • fadden,再次感谢您的帮助。只有两个问题:1)我的这个时序图有意义吗?原始(2 帧延迟):i.imgur.com/4E2cD9l.png DispSync:i.imgur.com/p7LdmXF.png 2)如果您减少足够的偏移量(有风险),是否可以在单个帧中绘制和合成减少渲染时间)?
    • 图表看起来不错。可以在一个 VSYNC 间隔(通常为 16.7 毫秒)内进行绘图和合成,但在实践中很难定期达到这些截止日期,因此尝试这样做通常会产生混乱的结果。请注意,如果一切都适合叠加层,SurfaceFlinger 组合非常快,但如果它回退到 GLES 组合,则需要更长的时间,特别是如果 SF 和应用程序最终竞争 GPU 资源。 DispSync 最准确的可视化是来自启用它的设备的 systrace 输出,例如Nexus 5。
    • 主板不支持 DispSync 是否存在硬件原因?还是制造商必须进行更多测试才能实施?我在 N4 上进行测试,我注意到没有为 N4 定义 VSYNC_EVENT_PHASE_OFFSET_NS 标志(RUNNING_WITHOUT_SYNC_FRAMEWORK 也没有)。在这种情况下,这些默认为 0,禁用 DispSync?
    • 我们曾希望 OEM 能够提供异相 VSYNC 信号,但没有成功,因此改用了软件解决方案。上次我检查时很少有设备启用了 DispSync。 RUNNING_WITHOUT_SYNC_FRAMEWORK 是独立但相关的——它指的是从您的问题链接的图形文档的“显式同步”部分中描述的围栏系统。 Nvidia tegra3 板设置了这个,例如android.googlesource.com/device/asus/grouper/+/lollipop-release/… 。他们使用的是旧的“隐式同步”方法,不过现在可能会修复。
    • 知道了;我真的很感谢你的时间。当我有几个空闲周期时,我会将所有这些整理到您的答案中。一个快速验证:如果没有使用 DispSync,那么 HW_VSYNC_0 是否立即触发 VSYNC-app 和 VSYNC-sf,或者这些仍然由软件中的计时器触发?或者是什么最终导致这些信号触发?
    猜你喜欢
    • 2019-06-20
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多