android - 了解 Android VSYNC 信号的必要性

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

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

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

感谢您提供的任何帮助。

最佳答案

要了解这些东西,最好从 System-Level Graphics Architecture 开始文档,特别注意需要三重缓冲部分和相关图表(最好是动画 GIF)。开头的句子“如果应用程序在 VSYNC 信号之间开始渲染”专门讨论 DispSync。阅读完后,希望设备图形文档的 DispSync 部分更有意义。

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

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

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

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

enter image description here

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

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

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

关于android - 了解 Android VSYNC 信号的必要性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27947848/

相关文章:

android - 如何在android 2.1版本中重写或修改XML

android - @+android :id? 是否有任何合法用途

android - Select All 导致 abc_ic_menu_selectall_material.xml Resources NotFoundException

android - 如何在 init.rc 文件中完全禁用 Android L 中的 SELinux?

android - 在 Kitkat (4.4) 中检查 gps 是否开启

android-mediaplayer - MediaPlayer 在 Android 4.4 上随机停止 (19)

android - 可靠获取状态栏高度解决KitKat半透明导航问题

java - 当我们从开始菜单中单击隐藏页脚和页眉的应用程序时打开浏览器

android - 预验证类中的 java.lang.IllegalAccessError 类引用解析为意外实现

android - 更新脚本 : I can't delete files in/data/system directory