Używam trzepotania pulpitu dla Linuksa. Nazywam metodę o nazwie, MarkTextureFrameAvailablektóra ma oznaczać teksturę do ponownego wysłania przez silnik. Ponieważ programuję odtwarzacz wideo, muszę dzwonić MarkTextureFrameAvailablez wątku odtwarzacza. Problem polega na tym, że silnik zmusza mnie do wywołania MarkTextureFrameAvailable(i dowolnej innej metody silnika) z wątku, który utworzył silnik.
Możesz zobaczyć, że wszystkie wywołania silnika kończą się w powłoce, która zawsze sprawdza, czy połączenia są wykonywane z tego samego wątku, który utworzył połączenie:
task_runners_.GetPlatformTaskRunner()->RunsTasksOnCurrentThread()
( https://github.com/flutter/engine/blob/master/shell/common/shell.cc#L838 )
Oto jak tworzę silnik trzepotania:
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;
}
jak widać, wątek tworzący silnik zostaje zablokowany przez flutter_controller.RunEventLoop();to jedyne miejsce, w którym mogłem umieścić dyspozytora zdarzeń, który wymusił wykonanie rzeczy z wątku głównego. Nie podoba mi się ten pomysł. Mimo że RunEventLoopWithTimeoutistnieje, muszę ustawić limit czasu i sprawdzać kolejkę MarkTextureFrameAvailablepołączeń. Nie sądzę, żeby to było optymalne.
Jak mam zadzwonić MarkTextureFrameAvailablez głównego wątku?
Znalazłem przykład użycia MarkTextureFrameAvailabletutaj: https://github.com/cloudwebrtc/flutter-webrtc/blob/desktop/common/src/flutter_video_renderer.cc#L90 i wygląda na to, że to kolejny wątek, który to nazywa. Jak to jest możliwe? Kiedy to robię, pojawia się FATALNY błąd, ale on robi i to działa?
Spędziłem dwa dni, próbując dowiedzieć się, który wątek wywołuje OnFrame w tym przykładzie, ale nie mogłem się dowiedzieć, ponieważ używa https://github.com/flutter-webrtc/libwebrtc, który używa Google webrtc: https://github.com/ JumpingYang001 / webrtc, który jest dla mnie za duży, aby znaleźć skąd pochodzi OnFrame. Ale to musi mnie z wątku. Jak to jest możliwe?
flutter_controller.RunEventLoop(), to na pewno MarkTextureFrameAvailablemusi zostać wywołany z innego wątku, co powinno być niemożliwe!
OnRenderjest wirtualnym zastąpieniem Fluttera, więc jest wywoływany przez wątek Fluttera.