SurfaceSyncGroup 简介

456 阅读2分钟

概述

SurfaceSyncGroup 提供了用于同步多个 Surface 操作的一种机制,它允许多个 Surface 之间的渲染和显示操作能够同步执行,以确保它们在屏幕上的呈现是协调的。一般用于 AttachedSurfaceControl、SurfaceView、SurfaceControlViewHost 和任何其他希望参与同步的 Surface。这让 Android 中的不同模块(同进程)、不同进程之间可以自行同步不同 Window 和 Layer。

关键信息解读

  1. Surface 同进程同步
  2. Surface 跨进程同步
  3. 同帧显示

来看一个示例:

SurfaceSyncGroup syncGroup = new SurfaceSyncGroup(NAME);
SyncGroup.addSyncCompleteCallback(mMainThreadExecutor, () -> {
    Log.d(TAG, "syncComplete");
};
syncGroup.addToSync(view1.getRootSurfaceControl());
syncGroup.addToSync(view2.getRootSurfaceControl());
syncGroup.addTransactionToSync(transaction);
syncGroup.markSyncReady();

将 View1 和 View2 加入到 SurfaceSyncGroup 中,只有两个 View 同时绘制好,SurfaceSyncGroup 的 syncComplete 方法才会被调用。

构造方法

SurfaceSyncGroup 提供了两个构造方法:

  1. SurfaceSyncGroup(@NonNull String name)
  2. SurfaceSyncGroup(String name, Consumer transactionReadyConsumer)

Android 标记第二个构造方法只能被用于 ViewRootImpl,因此我们一般用第一个构造方法构建一个SurfaceSyncGroup

添加同步的方法

  1. add(AttachedSurfaceControl, Runnable),添加 ViewRootImpl 到同步 Group 的方法
  2. add(SurfaceView, Consumer<SurfaceSyncGroup.SurfaceViewFrameCallback>),添加 SurfaceView 到同步 Group 的方法
  3. add(SurfaceControlViewHost.SurfacePackage, Runnable),添加 SurfaceControlViewHost.SurfacePackage 到同步 Group 的方法,常用于跨进程 Surface 同步
  4. add(SurfaceSyncGroup, Runnable),通用添加方法
  5. add(ISurfaceSyncGroup, boolean, Runnable),通用添加方法

监听同步结束的方法

  1. addSyncCompleteCallback(Executor, Runnable)

这允许调用者在同步完成时收到回调。当调用者注册的特定 SurfaceSyncGroup 完成时,调用者将只收到一个完成回调。这意味着 SurfaceSyncGroup 已标记为准备就绪,并且所有子项都已完成。这并不意味着 Transaction 已被 apply应用,因为它可能会被传递给父 SurfaceSyncGroup 或传递给另一个进程。如果调用者想知道所有子项是否已渲染好它们的帧,请通过当前方法添加一个监听回调。该方法接受一个 Executor 和一个 Runnable,当 SurfaceSyncGroup 完成时将调用该 Runnable,Executor 用于在所需线程上调用回调,你可以添加多个回调。