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 MarkTextureFrameAvailable
là đá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 MarkTextureFrameAvailable
từ 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ù RunEventLoopWithTimeout
tồ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 MarkTextureFrameAvailable
cuộ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 MarkTextureFrameAvailable
từ 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#L90 và có 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ể?
flutter_controller.RunEventLoop()
, nên chắc chắn MarkTextureFrameAvailable
phải được gọi từ luồng khác, điều này là không thể!
OnRender
là một ghi đè ảo của Flutter để nó được gọi bởi luồng Flutter.