我正在为Linux使用Flutter Desktop。我正在调用一个方法MarkTextureFrameAvailable
,应该标记要由引擎重新渲染的纹理。由于我正在为视频播放器编程,因此需要MarkTextureFrameAvailable
从播放器的线程中进行调用。问题是引擎迫使我MarkTextureFrameAvailable
从创建引擎的线程中调用(以及其他任何引擎方法)。
您可以看到所有对引擎的调用最终都在外壳程序中,该外壳程序始终进行检查以查看这些调用是否由创建该调用的同一线程进行:
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();
这是我唯一可以放置事件分发程序的地方,该事件分发程序强制从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。但这一定是我从一个线程。这怎么可能?
flutter_controller.RunEventLoop()
,因此可以确定MarkTextureFrameAvailable
必须从另一个线程中调用它,这是不可能的!
OnRender
是Flutter的虚拟替代,因此被Flutter线程调用。