bAko

在 Flutter 引擎的 Android 实现中,设备的 VSync 信号通过 Choreographer 触发,其产生及消费流程如下图所示:

Flutter VSync

Flutter 框架注册 VSync 回调之后,通过 C++ 侧的 VsyncWaiter 类等待 VSync 信号,后者通过 JNI 等一系列调用,最终 Java 侧的 VsyncWaiter 类调用 Android SDK 的 Choreographer.postFrameCallback 方法,再通过 JNI 一层层传回 Flutter 引擎消费掉此回调。Java 侧的 VsyncWaiter 核心代码如下:

 
  1. @Override

  2. public void asyncWaitForVsync(long cookie) {

  3.   Choreographer.getInstance()

  4.       .postFrameCallback(

  5.         new Choreographer.FrameCallback() {

  6.           @Override

  7.           public void doFrame(long frameTimeNanos) {

  8.             float fps = windowManager.getDefaultDisplay().getRefreshRate();

  9.             long refreshPeriodNanos = (long) (1000000000.0 / fps);

  10.             FlutterJNI.nativeOnVsync(

  11.               frameTimeNanos, frameTimeNanos + refreshPeriodNanos, cookie);

  12.           }

  13.         });

  14. }

在整个流程中,除了来自 Android SDK 的 Choreographer 以外,大多数逻辑几乎都由 C++ 和 Java 的基础 SDK 实现,可以直接在鸿蒙上复用,问题是鸿蒙目前的 API 文档中尚没有开放类似 Choreographer 的能力。所以现阶段我们可以借用鸿蒙提供的类似 iOS Grand Central Dispatch 的线程 API,模拟出 VSync 的信号触发与回调:

猜你喜欢

转载自blog.csdn.net/m0_54895416/article/details/113108742