Android 14 及更高版本的 SurfaceFlinger 中,onComposerHalRefreshonComposerHalVsync 这两个函数都与 VSync 相关,但它们的作用和触发时机不同。


1. onComposerHalVsync

作用

  • onComposerHalVsyncHWC(Hardware Composer) 触发,用于通知 SurfaceFlinger VSync 信号,即 屏幕已经刷新,新的帧可以提交

  • 这个回调通常会导致 SurfaceFlinger 开始新的合成(composition)周期。

触发时机

  • HWC 在每次 VSync 发生时调用,即 屏幕刷新完成后 触发。

  • 触发后,SurfaceFlinger 会调用 invalidate,然后开始新的帧合成(Frame Composition)。

  • 这个函数通常会在 主 VSync 线程 上执行。

相关流程

  1. HWC 检测到 VSync 到来(例如 60Hz 设备,每 16.67ms 触发一次)。

  2. HWC 调用 onComposerHalVsync(),通知 SurfaceFlinger

void SurfaceFlinger::onComposerHalVsync(int64_t timestamp) {
    ATRACE_CALL();
    mScheduler->onVsyncEvent(timestamp);
}

(代码不一定正确)

  1. Scheduler 触发 invalidate(),请求 SurfaceFlinger 开始新的合成。


2. onComposerHalRefresh

作用

  • onComposerHalRefreshHWC 触发,用于通知 SurfaceFlinger:
    "需要刷新屏幕,但不一定和 VSync 相关"

  • 主要用于:

    • 异步更新(如 HWC 直接修改帧缓冲区)

    • 屏幕的某些状态发生变化(如 HWC 触发的模式切换)

    • 非 VSync 触发的合成请求

触发时机

  • HWC 需要 SurfaceFlinger 重新进行合成时触发,但不一定是在 VSync 时刻。

  • 例如:

    • 异步更新 Buffer 时,HWC 可能会在 VSync 之外调用 onComposerHalRefresh(),让 SurfaceFlinger 重新提交帧。

相关流程

  1. HWC 触发 onComposerHalRefresh(),表示某些图层(Layer)需要重新渲染:

void SurfaceFlinger::onComposerHalRefresh() {
    ATRACE_CALL();
    scheduleComposite(FrameHint::kNone);
}

 

  1. 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 触发的帧合成

  1. HWC 在 VSync 发生时调用 onComposerHalVsync(timestamp)

  2. SurfaceFlinger 触发 invalidate()

  3. SurfaceFlinger 进行合成(doComposition()

  4. SurfaceFlinger 提交新帧到 HWC

  5. VSync 触发显示(HWC 刷新屏幕)

异步更新(非 VSync 触发)

  1. HWC 发现需要更新某些图层(不依赖 VSync),调用 onComposerHalRefresh()

  2. SurfaceFlinger 触发 scheduleComposite()

  3. SurfaceFlinger 进行合成并提交新帧

  4. HWC 立即应用更新


7. 总结

  • onComposerHalVsync在 VSync 发生时触发,通知 SurfaceFlinger 进行新的帧合成

  • onComposerHalRefreshHWC 需要异步触发 SurfaceFlinger 进行帧刷新,不一定和 VSync 相关。

VSync 控制的是屏幕刷新,而 Refresh 是 HWC 触发的 SurfaceFlinger 重新合成请求。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐