리눅스에 flutter desktop을 사용하고 있습니다. MarkTextureFrameAvailable엔진에 의해 다시 렌더링 될 텍스처를 표시해야하는 메소드를 호출 합니다. 비디오 플레이어를 프로그래밍하고 MarkTextureFrameAvailable있으므로 플레이어의 스레드에서 전화해야합니다 . 문제는 엔진이 MarkTextureFrameAvailable엔진을 생성 한 스레드에서 (및 다른 엔진 메소드)를 강제로 호출한다는 것 입니다.
엔진에 대한 모든 호출은 항상 셸에서 끝나며 호출을 생성 한 동일한 스레드에서 호출이 이루어 졌는지 항상 확인합니다.
task_runners_.GetPlatformTaskRunner()->RunsTasksOnCurrentThread()
( https://github.com/flutter/engine/blob/master/shell/common/shell.cc#L838 )
이것이 내가 flutter 엔진을 만드는 방법입니다.
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을 호출하는지 알아 내려고 2 일을 보냈지 만 Google의 webrtc를 사용 하는 https://github.com/flutter-webrtc/libwebrtc 를 사용 하기 때문에 찾을 수 없었 습니다 : https://github.com/ OnFrame 이 어디에서 호출되는지 찾기에 너무 큰 JumpingYang001 / webrtc . 그러나 그것은 실에서 나와야합니다. 그게 어떻게 가능해?
flutter_controller.RunEventLoop()다음 확실히, MarkTextureFrameAvailable불가능해야 다른 스레드에서 호출되는되어야합니다!
OnRender은 Flutter의 가상 재정의이므로 Flutter 스레드에 의해 호출됩니다.