如何从另一个线程调用Flutter Engine方法

Luc*_*lla 9 c++ multithreading flutter

我正在为Linux使用Flutter Desktop。我正在调用一个方法MarkTextureFrameAvailable,该方法应该标记要由引擎重新渲染的纹理。由于我正在为视频播放器编程,因此需要MarkTextureFrameAvailable从播放器的线程中进行调用。问题是引擎迫使我MarkTextureFrameAvailable从创建引擎的线程中调用(以及任何其他引擎方法)。

您可以看到所有对引擎的调用最终都在外壳程序中,该外壳程序始终进行检查以查看这些调用是否由创建该调用的同一线程进行:

task_runners_.GetPlatformTaskRunner()->RunsTasksOnCurrentThread()
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,创建引擎的线程被阻塞了,flutter_controller.RunEventLoop();这是我可以放置事件分配器的唯一地方,该事件分配器迫使事情从main的线程执行。我不喜欢这个主意。即使RunEventLoopWithTimeout存在,我也需要超时并继续检查队列中是否有MarkTextureFrameAvailable呼叫。我认为这不是最佳选择。

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

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

我花了两天的时间来弄清楚在此示例中哪个线程调用了OnFrame,但由于使用https://github.com/flutter-webrtc/libwebrtc而使用了Google的webrtc ,因此找不到它:https : //github.com/ JumpingYang001 / webrtc对我来说太大了,无法找到从何处调用OnFrame。但这一定是我从一个线程。这怎么可能?

小智 3

请参阅我的评论以了解对此答案的警告。看来您提供的示例项目通过一个简单的技巧来完成此任务。他们创建了一个继承flutter 渲染器类的新类,并覆盖OnFrame其他内容。当该重写被调用时,它位于 Flutter 线程的上下文中,因此可以按预期工作。