概述
SurfaceSyncGroup 提供了用于同步多个 Surface 操作的一种机制,它允许多个 Surface 之间的渲染和显示操作能够同步执行,以确保它们在屏幕上的呈现是协调的。一般用于 AttachedSurfaceControl、SurfaceView、SurfaceControlViewHost 和任何其他希望参与同步的 Surface。这让 Android 中的不同模块(同进程)、不同进程之间可以自行同步不同 Window 和 Layer。
关键信息解读
- Surface 同进程同步
- Surface 跨进程同步
- 同帧显示
来看一个示例:
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 提供了两个构造方法:
- SurfaceSyncGroup(@NonNull String name)
- SurfaceSyncGroup(String name, Consumer transactionReadyConsumer)
Android 标记第二个构造方法只能被用于 ViewRootImpl,因此我们一般用第一个构造方法构建一个SurfaceSyncGroup
添加同步的方法
- add(AttachedSurfaceControl, Runnable),添加 ViewRootImpl 到同步 Group 的方法
- add(SurfaceView, Consumer<SurfaceSyncGroup.SurfaceViewFrameCallback>),添加 SurfaceView 到同步 Group 的方法
- add(SurfaceControlViewHost.SurfacePackage, Runnable),添加 SurfaceControlViewHost.SurfacePackage 到同步 Group 的方法,常用于跨进程 Surface 同步
- add(SurfaceSyncGroup, Runnable),通用添加方法
- add(ISurfaceSyncGroup, boolean, Runnable),通用添加方法
监听同步结束的方法
- addSyncCompleteCallback(Executor, Runnable)
这允许调用者在同步完成时收到回调。当调用者注册的特定 SurfaceSyncGroup 完成时,调用者将只收到一个完成回调。这意味着 SurfaceSyncGroup 已标记为准备就绪,并且所有子项都已完成。这并不意味着 Transaction 已被 apply应用,因为它可能会被传递给父 SurfaceSyncGroup 或传递给另一个进程。如果调用者想知道所有子项是否已渲染好它们的帧,请通过当前方法添加一个监听回调。该方法接受一个 Executor 和一个 Runnable,当 SurfaceSyncGroup 完成时将调用该 Runnable,Executor 用于在所需线程上调用回调,你可以添加多个回调。