วิธีการโทรวิธีการเครื่องยนต์กระพือจากหัวข้ออื่น


9

ฉันใช้เดสก์ท็อปกระพือสำหรับลินุกซ์ ฉันกำลังเรียกวิธีที่เรียก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 นั้นถูกเรียกมาจากไหน แต่ฉันต้องจากกระทู้ มันเป็นไปได้ยังไงกัน?


หากคุณต้องการทางเลือกอื่นในการใช้การหมดเวลาเพื่อเรียกใช้งานเป็นระยะใน runloop หลักคุณสามารถส่ง Flutter engine PR เพื่อแสดง glfwPostEmptyEvent ผ่านทาง wrapper การมีวิธีการปลุก runloop หลักคือการเพิ่ม API การฝัง GLFW ที่สมเหตุสมผล
smorgan

@smorgan ฉันจะลองดู แต่ฉันประหลาดใจกับตัวอย่างนี้: github.com/cloudwebrtc/flutter-webrtc/blob/desktop/common/src/ …ทำได้โดยไม่ต้องใช้ RunEventLoopWithTimeOut เนื่องจากเขาบล็อกเธรดหลักด้วยflutter_controller.RunEventLoop()ดังนั้นแน่นอนMarkTextureFrameAvailableต้องถูกเรียกจากเธรดอื่นซึ่งควรจะเป็นไปไม่ได้!
Lucas Zanella

คำเตือนอย่างรวดเร็วก่อนที่ความคิดเห็นของฉัน - ไม่เคยได้ยินเกี่ยวกับ Flutter รู้น้อยมากเกี่ยวกับ Linux และฉันอยู่ในมือถือดังนั้นจึงไม่ต้องดูรหัสในตอนนี้ หวังว่าฉันจะสามารถช่วยเหลือได้ :) ตัวอย่างที่คุณให้มามีตัวเรนเดอร์วิดีโอของพวกเขาสืบทอดมาจากอินสแตนซ์ของตัวเรนเดอร์เรนเดอร์ตัวหลัก พวกเขาOnRenderคือการแทนที่ของ Flutter เสมือนดังนั้นมันจึงถูกเรียกใช้โดยเธรด Flutter
ดองริก

คำตอบ:


3

ดูความคิดเห็นของฉันสำหรับข้อแม้กับคำตอบนี้ ดูเหมือนว่าโปรเจ็กต์ตัวอย่างที่คุณให้ไว้จะทำสิ่งนี้ได้ด้วยเคล็ดลับง่ายๆ พวกเขาสร้างคลาสใหม่ที่สืบทอดคลาสตัวเรนเดอร์ที่กระพือปีกOnFrameเหนือสิ่งอื่นใด เมื่อการแทนที่นั้นถูกเรียกมันจะอยู่ในบริบทของเธรด Flutter และทำงานได้ตามที่คาดไว้


ขอบคุณมากที่คุณพยายามช่วย! อย่างไรก็ตามคลาสจาก Flutter นั้นเป็นคลาสย่อยTexture,ที่ไม่มีเมธอด onFrame วิธี onFrame นั้นเป็นRTCVideoRendererสิ่งที่เกี่ยวข้องกับ Flutter
Lucas Zanella

ดูที่นี่ ดูเหมือนว่าพวกเขาจะแทนที่ Flutter และอาจใช้ระบบปลั๊กอินที่รองรับ คำแนะนำที่ดีที่สุดของฉันคืออ่านเอกสาร Flutter ฉันยินดีที่จะเดิมพันหากคุณวาง BP ใน OnFrame มันจะอยู่ในบริบทของเธรด Flutter ตามที่คาดไว้
ดองริก

ฉันไม่สามารถใช้ระบบปลั๊กอินได้และฉันอ่านเอกสารแล้วไม่มีวิธีการใช้งาน onFrame สิ่งเดียวจากคลาส FlutterVideoRenderer คือ Texture ซึ่งไม่มีเมธอด onFrame จริง ๆ แล้วฉันพบว่ามีการกำหนด onFrame และเป็นสิ่งที่มาจากห้องสมุด WebRTC ตามที่คุณเห็นที่นี่github.com/JumpingYang001/webrtc/ …
Lucas Zanella

@ LucasZanella Pickle Rick นั้นถูกต้องFlutterVideoRenderer สืบทอดมาจากสองคลาส - Texture(บรรทัดที่ 16) และRTCVideoRenderer<scoped_refptr<RTCVideoFrame>>(บรรทัดที่ 17) (C ++ อนุญาตให้มีการสืบทอดหลายอัน) แล้วจึงแทนที่OnFrameเมธอด (บรรทัดที่ 24) เมื่อOnFrameเหตุการณ์ถูกไล่ออกเหตุการณ์จะถูกดำเนินการในบริบทของเธรดหลักของคุณ
4LegsDrivenCat

@ 4LegsDrivenCat แต่ OnFrame ไม่ได้มาจาก Flutter มันมาจาก RTCVideoRenderer ซึ่งไม่ได้มาจาก Flutter
Lucas Zanella
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.