VSYNC 信号可同步显示流水线。显示流水线由应用渲染、SurfaceFlinger 合成以及用于在屏幕上显示图像的硬件混合渲染器 (HWC) 组成。VSYNC 可同步应用唤醒以开始渲染的时间、SurfaceFlinger 唤醒以合成屏幕的时间以及屏幕刷新周期。这种同步可以消除卡顿,并提升图形的视觉表现。

HWC 可生成 VSYNC 事件并通过回调将事件发送到 SurfaceFlinger:

typedef void (*HWC2_PFN_VSYNC)(hwc2_callback_data_t callbackData,

hwc2_display_t display, int64_t timestamp);

注意:HWC 从 HAL_PRIORITY_URGENT_DISPLAY 的线程触发 hwc2_callback_data_t,延迟时间尽可能短,通常小于 0.5 毫秒。

SurfaceFlinger 通过调用 setVsyncEnabled 来控制 HWC 是否生成 VSYNC 事件。SurfaceFlinger 使 setVsyncEnabled 能够生成 VSYNC 事件,因此它可以与屏幕的刷新周期同步。当 SurfaceFlinger 同步到屏幕刷新周期时,SurfaceFlinger 会停用 setVsyncEnabled 以阻止 HWC 生成 VSYNC 事件。如果 SurfaceFlinger 检测到实际 VSYNC 与它先前建立的 VSYNC 之间存在差异,则 SurfaceFlinger 会重新启动 VSYNC 事件生成过程。

VSYNC 偏移

同步应用和 SurfaceFlinger 渲染循环应同步到硬件 VSYNC。在 VSYNC 事件中,屏幕开始显示帧 N,而 SurfaceFlinger 开始为帧 N+1 合成窗口。应用处理等待的输入并生成帧 N+2。

与 VSYNC 同步会实现一致的延迟时间。它可以减少应用和 SurfaceFlinger 中的错误,并最大限度减小相位内外屏幕之间的偏移。这要假定应用和 SurfaceFlinger 的每帧时间没有很大变化。延迟至少为两帧。

为了解决此问题,您可以通过使应用和合成信号与硬件 VSYNC 相关,从而利用 VSYNC 偏移减少输入设备到屏幕的延迟。这是有可能的,因为应用加合成通常需要不到 33 毫秒的时间。

VSYNC 偏移的结果是具有相同周期和偏移相位的三个信号:

HW_VSYNC_0 - 屏幕开始显示下一帧。

VSYNC - 应用读取输入内容并生成下一帧。

SF_VSYNC - SurfaceFlinger 开始为下一帧进行合成。

通过 VSYNC 偏移,SurfaceFlinger 接收缓冲区并合成帧,而应用同时处理输入内容并渲染帧。

注意:VSYNC 偏移会缩短可用于应用和合成的时间,因此增加了出错几率。

DispSync

DispSync 维护屏幕基于硬件的周期性 VSYNC 事件的模型,并使用该模型在硬件 VSYNC 事件的特定相位偏移处执行回调。

DispSync 是一个软件锁相回路 (PLL),它可以生成由 Choreographer 和 SurfaceFlinger 使用的 VSYNC 和 SF_VSYNC 信号,即使没有来自硬件 VSYNC 的偏移也是如此。

图 1. DispSync 流程

DispSync 具有以下特点:

参考 - HW_VSYNC_0。

输出 - VSYNC 和 SF_VSYNC。

反馈 - 自硬件混合渲染器的退出栅栏有信号状态时间戳。

VSYNC/退出偏移

退出栅栏的有信号状态时间戳必须与 HW VSYNC 相符,即使在不使用偏移相位的设备上也是如此。否则,造成的错误会更加严重。智能面板通常有一个增量:退出栅栏是对显示内存进行直接内存访问 (DMA) 的终点,但是实际的显示切换和 HW VSYNC 会晚一段时间。

PRESENT_TIME_OFFSET_FROM_VSYNC_NS 在设备的 BoardConfig.mk makefile 中设置。它取决于屏幕控制器和面板特性。从退出栅栏时间戳到 HW VSYNC 信号的时间以纳秒为单位进行测量。

VSYNC 和 SF_VSYNC 偏移

VSYNC_EVENT_PHASE_OFFSET_NS 和 SF_VSYNC_EVENT_PHASE_OFFSET_NS 根据高负载使用情形进行了保守设置,例如在窗口过渡期间进行部分 GPU 合成或 Chrome 滚动显示包含动画的网页。这些偏移允许较长的应用渲染时间和较长的 GPU 合成时间。

超过一两毫秒的延迟时间是非常明显的。为了最大限度地缩短延迟时间而不显著增加错误计数,请集成彻底的自动化错误测试。

注意:VSYNC 和 SF_VSYNC 偏移同样在设备的 BoardConfig.mk 文件中配置。两个设置都是 HW_VSYNC_0 之后以纳秒为单位的偏移,默认值为零(如未设置的话),也可以为负值。

android vsync,VSYNC  |  Android 开源项目  |  Android Open Source Project相关推荐

  1. 【开源项目----Android OPenGLES渲染YUV视频文件】

    [开源项目----Android OPenGLES渲染YUV视频文件] OpenGLES对YUV渲染相关文章参考

  2. android开源数据库,Android Hawk数据库 github开源项目

    Android Hawk数据库 github开源项目 Hawk 是一个很便捷的数据库  . 操作数据库仅仅需一行代码 , 能存不论什么数据类型 . github 地址: https://github. ...

  3. Android Studio 运行HyperLPR开源项目安卓APP

    Android Studio 运行HyperLPR开源项目安卓APP 前提:已安装Android Studio 作为一个安卓小白,我学uni-app只是机缘巧合,只是想看看微信小程序怎么开发的,然后一 ...

  4. android10分区镜像,分区和映像  |  Android 开源项目  |  Android Open Source Project

    分区 Android 设备包含若干个分区,这些分区在启动过程中发挥不同的作用.为了支持 A/B 更新,设备需要为 boot.system.vendor 和 radio 分区分别单独配置一个槽位. bo ...

  5. 【Android QR Code】开源项目:ZXing(一)导入项目

    维基百科:QR Code http://en.wikipedia.org/wiki/QR_code 开源项目:ZXing http://code.google.com/p/zxing/ 1.下载源代码 ...

  6. Android github上优秀开源项目分类汇总

    第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.P ...

  7. 【转】Android 自己收集的开源项目和文章集合(持续更新至2018.12.17)

    2017-12-21 1.炫酷开屏动画框架 https://github.com/JoshuaRogue/FancyView 2.防京东,支付宝密码键盘和密码输入框 https://github.co ...

  8. [转]Android github上优秀开源项目分类汇总

    第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.P ...

  9. Android最火的开源项目

    1,Material Animations 演示View的平移.缩放动画,activity进入和退出动画,界面间元素共享,并且开发者在README中,对动画原理进行了精讲,是学习动画很好的项目,项目代 ...

  10. Android 自己收集的开源项目和文章集合

    1.仿QQ说说发图片选择框架  https://github.com/yaozs/ImageShowPicker 2.炫酷开屏动画框架  https://github.com/JoshuaRogue/ ...

最新文章

  1. Spring Boot+Redis+拦截器+自定义Annotation实现接口自动幂等
  2. Pytorch中改变形状和交换维度详解:view()、reshape()、transpose()、permute()以及contiguous()
  3. 斜率小于0的连线数量 51Nod - 1107 (树状数组+离散化)
  4. 小米做手机是真不赚钱,米粉要支持请多容忍广告
  5. 【指标统计】本区或跨区取WEB统计指标配置方法
  6. 第一次作业(李奇峰 201731062426)
  7. 如何使用 SQL Server FILESTREAM 存储非结构化数据?这篇文章告诉你!
  8. td里面字体大小怎么改_教你王者荣耀改战区
  9. 显示墙 显示服务器地址,云墙怎么看服务器地址
  10. Linux命令解释之awk
  11. 实际参数列表和形式参数列表长度不同_Dynamo参数化轴网,这些对你很有帮助
  12. JQuery Mobile - 固定住页面和页脚
  13. paip.log4j 日志系统 参数以及最佳实践
  14. H3CIE(WLAN)学习笔记(4)——PHY层协议
  15. CIO峰会:企业私有云存储实践方案
  16. 1024程序员节日随笔
  17. 【备忘录】浏览器不能上网但是微信能收到消息的一个解决办法
  18. 辰光融信全面推出基于可信计算3.0技术的安全增强型打印机
  19. Yahoo!创始人:杨致远的故事
  20. eas库存状态调整单不能反审核_金蝶EAS供应链管理标准操作规程(存货核算).doc

热门文章

  1. 开源免费的对象存储Minio
  2. 积分价值调整的两个原因
  3. C++ 获取时间戳:下周一、月初、月中、月末
  4. 升级shiro_北海道Shiro身体乳真假辨别
  5. Oracle 表解锁
  6. 学习永不止步---考后总结
  7. 用“真快乐”切入社交电商后,国美做“家装”能否多点开花?
  8. 【动态规划】【RQ82】又上锁妖塔
  9. 数字ic验证学习ing
  10. 目标检测之R-CNN