如何从另一个线程调用颤振引擎方法
How to call flutter engine methods from another thread
我正在使用 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 线程的上下文中,因此按预期工作。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 如何从另一个线程调用颤振引擎方法
- 如何通过 MS Chakracore JavaScript 引擎调用C++函数或方法
- 虚幻引擎Actor类的OnConstruction()方法未正确执行
- 对象复制:复制随机引擎的正确方法