onComposerHalRefresh和onComposerHalVsync 的区别
这两个函数都与 VSync 相关,但它们的作用和触发时机不同。,然后开始新的帧合成(Frame Composition)。(例如 60Hz 设备,每 16.67ms 触发一次)。,请求 SurfaceFlinger 开始新的合成。发现需要更新某些图层(不依赖 VSync),调用。触发,用于通知 SurfaceFlinger。,让 SurfaceFlinger 重新提交帧。开始新的合成(compos
在 Android 14 及更高版本的 SurfaceFlinger 中,onComposerHalRefresh 和 onComposerHalVsync 这两个函数都与 VSync 相关,但它们的作用和触发时机不同。
1. onComposerHalVsync
作用
-
onComposerHalVsync由 HWC(Hardware Composer) 触发,用于通知 SurfaceFlinger VSync 信号,即 屏幕已经刷新,新的帧可以提交。 -
这个回调通常会导致
SurfaceFlinger开始新的合成(composition)周期。
触发时机
-
HWC 在每次 VSync 发生时调用,即 屏幕刷新完成后 触发。
-
触发后,SurfaceFlinger 会调用
invalidate,然后开始新的帧合成(Frame Composition)。 -
这个函数通常会在 主 VSync 线程 上执行。
相关流程
-
HWC 检测到 VSync 到来(例如 60Hz 设备,每 16.67ms 触发一次)。
-
HWC 调用
onComposerHalVsync(),通知 SurfaceFlinger:
void SurfaceFlinger::onComposerHalVsync(int64_t timestamp) {
ATRACE_CALL();
mScheduler->onVsyncEvent(timestamp);
}
(代码不一定正确)
-
Scheduler触发invalidate(),请求 SurfaceFlinger 开始新的合成。
2. onComposerHalRefresh
作用
-
onComposerHalRefresh由 HWC 触发,用于通知 SurfaceFlinger:
"需要刷新屏幕,但不一定和 VSync 相关"。 -
主要用于:
-
异步更新(如 HWC 直接修改帧缓冲区)
-
屏幕的某些状态发生变化(如 HWC 触发的模式切换)
-
非 VSync 触发的合成请求
-
触发时机
-
HWC 需要 SurfaceFlinger 重新进行合成时触发,但不一定是在 VSync 时刻。
-
例如:
-
异步更新 Buffer 时,HWC 可能会在 VSync 之外调用
onComposerHalRefresh(),让 SurfaceFlinger 重新提交帧。
-
相关流程
-
HWC 触发
onComposerHalRefresh(),表示某些图层(Layer)需要重新渲染:
void SurfaceFlinger::onComposerHalRefresh() {
ATRACE_CALL();
scheduleComposite(FrameHint::kNone);
}
-
scheduleComposite()触发 SurfaceFlinger 进行新的合成。
3. onComposerHalVsync vs. onComposerHalRefresh 区别总结
| 函数 | 触发方 | 作用 | 触发时机 | 影响 |
|---|---|---|---|---|
onComposerHalVsync |
HWC | 通知 VSync 发生 | VSync 到来时触发 | 触发 invalidate(),SurfaceFlinger 开始合成 |
onComposerHalRefresh |
HWC | 请求 SurfaceFlinger 进行刷新 | 异步触发,不一定在 VSync 发生时 | 触发 scheduleComposite(),可能导致新的合成 |
4. 什么时候用 onComposerHalRefresh?
-
HWC 直接修改了 FrameBuffer,需要重新提交帧(例如 DPU 进行异步操作)。
-
某些特定模式下,SurfaceFlinger 需要重新合成(例如
doze模式)。 -
非 VSync 触发的屏幕更新(如外部输入、Display Mode 切换)。
5. 什么时候用 onComposerHalVsync?
-
每次 VSync 到来时,HWC 触发 SurfaceFlinger 进行新的帧合成。
-
保证帧的渲染与显示同步,防止撕裂。
6. 典型流程
假设 设备刷新率是 60Hz(VSync 每 16.67ms 触发),SurfaceFlinger 的工作流程如下:
正常 VSync 触发的帧合成
-
HWC在 VSync 发生时调用onComposerHalVsync(timestamp) -
SurfaceFlinger触发invalidate() -
SurfaceFlinger进行合成(doComposition()) -
SurfaceFlinger提交新帧到HWC -
VSync 触发显示(
HWC刷新屏幕)
异步更新(非 VSync 触发)
-
HWC发现需要更新某些图层(不依赖 VSync),调用onComposerHalRefresh() -
SurfaceFlinger触发scheduleComposite() -
SurfaceFlinger进行合成并提交新帧 -
HWC 立即应用更新
7. 总结
-
onComposerHalVsync:在 VSync 发生时触发,通知 SurfaceFlinger 进行新的帧合成。 -
onComposerHalRefresh:HWC 需要异步触发 SurfaceFlinger 进行帧刷新,不一定和 VSync 相关。
✅ VSync 控制的是屏幕刷新,而 Refresh 是 HWC 触发的 SurfaceFlinger 重新合成请求。
更多推荐
所有评论(0)