ฉันใช้เดสก์ท็อปกระพือสำหรับลินุกซ์ ฉันกำลังเรียกวิธีที่เรียก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();
ซึ่งเป็นที่เดียวที่ฉันสามารถใส่ตัวเลือกเหตุการณ์ที่บังคับให้สิ่งต่าง ๆ ถูกเรียกใช้จากเธรดหลัก ฉันไม่ชอบความคิดนี้ แม้ว่าจะRunEventLoopWithTimeout
มีอยู่ฉันต้องหมดเวลาและตรวจสอบในคิวสำหรับการMarkTextureFrameAvailable
โทร ฉันไม่คิดว่านี่จะดีที่สุด
ดังนั้นฉันจะโทรMarkTextureFrameAvailable
จากเธรดหลักได้อย่างไร
ฉันพบตัวอย่างของการใช้งานMarkTextureFrameAvailable
ที่นี่: https://github.com/cloudwebrtc/flutter-webrtc/blob/desktop/common/src/flutter_video_renderer.cc#L90และดูเหมือนว่าจะเป็นเธรดอื่นที่เรียกมัน มันเป็นไปได้ยังไงกัน? เมื่อฉันทำฉันได้รับข้อผิดพลาด FATAL แต่เขาทำและทำงานได้หรือไม่
ฉันใช้เวลาสองวันในการพยายามหาว่าเธรดใดที่เรียกใช้ OnFrame ในตัวอย่างนี้ แต่ไม่สามารถค้นหาได้เพราะใช้https://github.com/flutter-webrtc/libwebrtcซึ่งใช้ webrtc ของ Google: https://github.com/ JumpingYang001 / webrtcซึ่งใหญ่เกินไปสำหรับฉันที่จะค้นหาว่า OnFrame นั้นถูกเรียกมาจากไหน แต่ฉันต้องจากกระทู้ มันเป็นไปได้ยังไงกัน?
flutter_controller.RunEventLoop()
ดังนั้นแน่นอนMarkTextureFrameAvailable
ต้องถูกเรียกจากเธรดอื่นซึ่งควรจะเป็นไปไม่ได้!
OnRender
คือการแทนที่ของ Flutter เสมือนดังนั้นมันจึงถูกเรียกใช้โดยเธรด Flutter