如何从另一个线程调用颤振引擎方法

How to call flutter engine methods from another thread

本文关键字:引擎 方法 调用 线程 另一个      更新时间:2023-10-16

我正在使用 linux 的 flutter 桌面。我调用了一个名为MarkTextureFrameAvailable的方法,该方法应该标记要由引擎重新渲染的纹理。由于我正在编写视频播放器,因此我需要从播放器的线程调用MarkTextureFrameAvailable。问题是引擎迫使我从创建引擎的线程调用MarkTextureFrameAvailable(以及任何其他引擎方法(。

您可以看到,对引擎的所有调用最终都在 shell 中结束,该 shell 始终会检查调用是否来自创建调用的同一线程:

task_runners_.GetPlatformTaskRunner()->RunsTasksOnCurrentThread()

(https://github.com/flutter/engine/blob/master/shell/common/shell.cc#L838(

这就是我创建颤振引擎的方式:

int main(int argc, char **argv) {
//..
flutter::FlutterWindowController flutter_controller(icu_data_path);
// Start the engine.
if (!flutter_controller.CreateWindow(800, 600, "Flutter WebRTC Demo", assets_path,
arguments)) {
return EXIT_FAILURE;
}
// Register any native plugins.
FlutterWebRTCPluginRegisterWithRegistrar(
flutter_controller.GetRegistrarForPlugin("FlutterWebRTCPlugin"));
// Run until the window is closed.
flutter_controller.RunEventLoop();
return EXIT_SUCCESS;
}

如您所见,创建引擎的线程被flutter_controller.RunEventLoop();阻塞,这是我唯一可以放置事件调度程序的地方,该事件调度程序强制从主线程执行。我不喜欢这个想法。即使存在RunEventLoopWithTimeout,我也需要设置超时并继续检查队列中的MarkTextureFrameAvailable调用。我不认为这是最佳的。

那么我应该如何从主线程调用MarkTextureFrameAvailable呢?

我在这里找到了一个MarkTextureFrameAvailable用法的例子:https://github.com/cloudwebrtc/flutter-webrtc/blob/desktop/common/src/flutter_video_renderer.cc#L90,看起来它是另一个调用它的线程。怎么可能?当我这样做时,我得到一个致命的错误,但他这样做了,它有效吗?

我花了两天时间试图弄清楚在这个例子中哪个线程调用了OnFrame,但找不到,因为它使用了使用google的webrtc的 https://github.com/flutter-webrtc/libwebrtc:https://github.com/JumpingYang001/webrtc 太大了,我找不到OnFrame是从哪里调用的。但它必须我从一个线程。怎么可能?

请参阅我的评论以了解此答案的警告。您提供的示例项目似乎通过一个简单的技巧完成了这一点。他们创建了一个继承颤振渲染器类的新类,覆盖OnFrame等。当该覆盖被调用时,它会在 Flutter 线程的上下文中,因此按预期工作。