Làm thế nào để gọi các phương thức rung động từ một luồng khác


9

Tôi đang sử dụng máy tính để bàn rung cho linux. Tôi đang gọi một phương thức được gọi MarkTextureFrameAvailablelà đánh dấu một kết cấu sẽ được đăng ký lại bởi động cơ. Vì tôi đang lập trình trình phát video, tôi cần gọi MarkTextureFrameAvailabletừ chuỗi của trình phát. Vấn đề là động cơ buộc tôi phải gọi MarkTextureFrameAvailable(và bất kỳ phương thức động cơ nào khác) từ luồng tạo ra động cơ.

Bạn có thể thấy rằng tất cả các cuộc gọi đến động cơ kết thúc trong vỏ luôn kiểm tra xem các cuộc gọi có được thực hiện từ cùng một chuỗi đã tạo cuộc gọi không:

task_runners_.GetPlatformTaskRunner()->RunsTasksOnCurrentThread()

( https://github.com/flutter/engine/blob/master/shell/common/shell.cc#L838 )

Đây là cách tôi tạo công cụ rung:

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;
}

như bạn có thể thấy, luồng tạo ra động cơ bị chặn bởi flutter_controller.RunEventLoop();đó là nơi duy nhất tôi có thể đặt một bộ điều phối sự kiện buộc mọi thứ phải được thực thi từ luồng chính. Tôi không thích ý tưởng này. Mặc dù RunEventLoopWithTimeouttồn tại, tôi cần đặt thời gian chờ và tiếp tục kiểm tra hàng đợi các MarkTextureFrameAvailablecuộc gọi. Tôi không nghĩ rằng điều này là tối ưu.

Vì vậy, làm thế nào tôi nên gọi MarkTextureFrameAvailabletừ chủ đề chính?

Tôi đã tìm thấy một ví dụ về cách sử dụng MarkTextureFrameAvailableở đây: https://github.com/cloudwebrtc/flutter-webrtc/blob/desktop/common/src/flutter_video_Vnderer.cc#L90có vẻ như đó là một chủ đề khác gọi nó. Làm thế nào là nó có thể? Khi tôi làm, tôi nhận được một lỗi FATAL, nhưng anh ta làm và nó hoạt động?

Tôi đã dành hai ngày để cố gắng tìm ra chủ đề nào gọi OnFrame trong ví dụ này nhưng không thể tìm ra vì nó sử dụng https://github.com/flutter-webrtc/libwebrtc sử dụng webrtc của google: https://github.com/ JumpingYang001 / webrtc quá lớn để tôi tìm thấy OnFrame được gọi từ đâu. Nhưng nó phải cho tôi từ một chủ đề. Làm thế nào là nó có thể?


Nếu bạn muốn một giải pháp thay thế cho việc sử dụng thời gian chờ để chạy các tác vụ định kỳ trong runloop chính, bạn có thể gửi PR công cụ Flutter để hiển thị glfwPostEmptyEvent thông qua trình bao bọc. Có một cách để đánh thức runloop chính là một bổ sung hợp lý cho API nhúng GLFW.
tổ chức

@smorgan Tôi sẽ cố gắng đó, nhưng tôi ngạc nhiên về cách này ví dụ: github.com/cloudwebrtc/flutter-webrtc/blob/desktop/common/src/... không cần dùng RunEventLoopWithTimeOut. Vì anh ta chặn luồng chính với flutter_controller.RunEventLoop(), nên chắc chắn MarkTextureFrameAvailablephải được gọi từ luồng khác, điều này là không thể!
Lucas Zanella

Hãy cẩn thận trước nhận xét của tôi - chưa bao giờ nghe về Flutter, biết rất ít về Linux và tôi đang sử dụng điện thoại di động nên chắc chắn không xem qua mã ngay bây giờ. Hy vọng tôi vẫn có thể giúp đỡ. :) Ví dụ bạn đưa ra có trình kết xuất video của họ kế thừa từ ví dụ giống như trình kết xuất trình rung chính. Chúng OnRenderlà một ghi đè ảo của Flutter để nó được gọi bởi luồng Flutter.
Pickle Rick

Câu trả lời:


3

Xem bình luận của tôi cho cảnh báo cho câu trả lời này. Dường như dự án ví dụ bạn cung cấp thực hiện điều này bằng một thủ thuật đơn giản. Họ tạo ra một lớp mới kế thừa lớp trình kết xuất rung, ghi đè lên OnFramecác thứ khác. Khi ghi đè đó được gọi là nó trong ngữ cảnh của chuỗi Flutter và do đó hoạt động như mong đợi.


Cảm ơn bạn rất nhiều bởi nỗ lực của bạn để giúp đỡ! Tuy nhiên, lớp từ Flutter mà nó phân lớp là Texture,không có phương thức onFrame. Phương thức onFrame RTCVideoRendererđó không liên quan gì đến Flutter.
Lucas Zanella

Xem ở đây . Có vẻ như họ ghi đè Flutter và có thể sử dụng hệ thống plugin được hỗ trợ. Lời khuyên tốt nhất của tôi sẽ là đọc tài liệu Flutter. Tôi sẽ sẵn sàng đặt cược nếu bạn đặt một BP trong OnFrame, nó sẽ nằm trong bối cảnh của chuỗi Flutter như mong đợi.
Pickle Rick

Tôi đang sử dụng hệ thống plugin và tôi đã đọc tài liệu, không có phương pháp onFrame. Điều duy nhất từ ​​Flutter trong lớp FlutterVideoRenderer là Texture, không có phương thức onFrame. Trên thực tế tôi đã tìm thấy nơi onFrame được xác định và là một thứ từ thư viện WebRTC như bạn có thể thấy ở đây github.com/JumpingYang001/webrtc/ trộm
Lucas Zanella

@LucasZanella Pickle Rick đã đúng, FlutterVideoRenderer kế thừa từ hai lớp - Texture(dòng 16) và RTCVideoRenderer<scoped_refptr<RTCVideoFrame>>(dòng 17) (C ++ cho phép nhiều kế thừa) và sau đó nó ghi đè OnFramephương thức (dòng 24). Khi OnFramesự kiện được kích hoạt, nó được thực thi trong ngữ cảnh của luồng chính của bạn.
4LegsDrivenCat

@ 4LegsDrivenCat nhưng OnFrame không phải từ Flutter, mà là từ RTCVideoRenderer không phải từ Flutter
Lucas Zanella
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.