流畅度优化之一——Vsync的介绍


用简单通俗易懂的话来记录自己对Vsync的理解

1.前言

听说oppofindx2pro的屏幕刷新率是120Hz,那么屏幕的刷新率到底是啥?提高刷新率为啥就感觉顺滑了很多呢?
这是做的对比,大家可以看下
总体来说,是顺滑了很多,为啥在视觉上会感觉顺滑很多呢?从60HZ->120HZ,增加的是什么?增加的是刷新率,刷新率是如何实现的呢?Vsync闪亮登场。

2.Vsync

正如我们所知,平时我们使用的手机的的刷新率是60HZ,也就是每秒钟刷新60帧,每帧保持16.6ms。那是如何实现的呢?这里涉及HAL(Hardware Abstraction Layer),SurfaceFlinger,下图是传递流程。

在这里插入图片描述

1.Vsync信号图

安卓系统中VSync 信号如图所示。
1、屏幕产生的硬件 VSync: 硬件 VSync 是一个脉冲信号,简称hs Vsync
2、由 SurfaceFlinger 将其转成的软件 Vsync 信号:分为vsync_app和vsync_sf。
Vsync_app用于调用Choreographer.onVsync进行View的绘制工作,在onDraw()时,会调用Skia绘制图元,使用匿名内存传递给SurfaceFlinger进程。
Vsync_sf是将队列中的图元使用CPU/GPU进行展示在显示屏。
引入Vsync机制本质是协调vsync_app生成UI的图元数据和vsync_sf的合成图像,app是数据的生产者,surfaceFlinger是数据的消费者。vsync避免了Tearing现象。vsync信号有两个消费者,一个是app,一个surfaceflinger,这两个消费者并不是同时接收vsync,他们之间有个offeset.

2.vsync-offset引入原因

提高“跟手性”m

3.解惑

1.为啥120hz比60hz更流畅
实际上电影是24hz,120hz相当于1秒钟,你看到了120帧连续图片进行播放,而60HZ则只有60帧,肯定前者更清晰。

4.站在巨人肩膀

1.Vsync
2.Android 重学系列 SurfaceFlinger的概述
3.Android Systrace 基础知识 - Vsync 解读
4.android的渲染机制

### OV428与VSync特性的对比分析 #### 1. OV428概述 OV428 是一款图像传感器芯片,通常用于嵌入式设备中的摄像头模块。它支持多种工作模式和分辨率设置,并可以通过 I2C 或 SCCB 协议进行寄存器配置[^3]。类似于 OV7725 的设计思路,在实际应用中,OV428 的初始化过程也主要依赖于写操作完成寄存器配置。 由于 OV428 并不直接涉及 Android 系统级别的同步机制(如 VSync),它的功能更多集中在硬件层面的帧捕获与时钟控制上。这意味着 OV428 更关注的是如何生成稳定的视频流数据,而不是参与系统的显示刷新周期管理。 --- #### 2. VSync的工作原理及其演变 VSync(垂直同步信号)是一种广泛应用于图形处理领域的时间同步机制。在 Android 中,VSync 被用来协调 GPU 渲染、CPU 计算以及屏幕更新之间的关系,从而减少卡顿现象并提升用户体验[^2]。具体而言: - **订阅机制**:应用程序需要显式调用 `nativeScheduleVsync` 方法来注册接收 VSync 事件的通知。 - **触发频率**:标准情况下,Android 设备上的 VSync 信号每隔约 16.6 毫秒发出一次,对应常见的 60Hz 屏幕刷新率。 - **历史发展**:从 Android 4.1 开始引入基础版本的 VSync 支持,经过多次迭代优化至当前较为成熟的形态[^4]。 值得注意的是,VSync 主要服务于软件栈内的渲染流程调度,而像 OV428 这样的外设则运行在一个独立的操作环境中。 --- #### 3. OV428与VSync的关系探讨 尽管两者分属不同技术范畴——一个是负责采集原始图像数据的硬件组件;另一个则是操作系统内部保障视觉流畅度的关键算法——但在某些特定场景下仍可能存在间接联系: - 如果基于 OV428 构建的应用程序希望实现精确的画面展示效果,则可能需要用到 VSync 同步机制以确保每一帧画面能够及时呈现在屏幕上; - 对于那些集成了自定义驱动层或者框架扩展的产品线来说,也可能尝试将来自 OV428 的帧就绪通知融入全局时间轴规划当中,进而形成更加紧密耦合的整体解决方案。 不过上述设想都需要额外开发适配逻辑才能达成目标,单纯依靠现有 API 接口难以自动建立这种关联性。 ```python # 假设代码片段演示如何结合使用 def on_vsync_received(timestamp): global latest_frame_from_ov428 # 获取最新一帧由 OV428 提供的数据包 frame_data = capture_next_image(latest_frame_from_ov428) # 执行必要的预处理步骤... processed_result = preprocess(frame_data) # 利用此时刻作为参考点提交给渲染管线 submit_to_renderer(processed_result, timestamp) ``` --- #### 4. 差异化总结 | 特性 | OV428 | VSync | |--------------------|--------------------------------------|----------------------------------------| | 功能定位 | 图像捕捉 | 显示刷新 | | 技术层次 | 硬件级 | 软件级 | | 使用范围 | 非常局限 | 应用普遍 | | 是否需主动请求 | 不适用 | 必须 | 综上所述,虽然二者之间不存在天然绑定关系,但通过精心设计可以探索潜在合作机会[^1][^2].
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值