আমি লিনাক্সের জন্য ফ্লটার ডেস্কটপ ব্যবহার করছি। আমি এমন একটি পদ্ধতি কল করছি 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 এবং দেখে মনে হচ্ছে এটি এটি অন্য থ্রেড বলে। কিভাবে এটা সম্ভব? আমি যখন করি, তখন আমি একটি চূড়ান্ত ত্রুটি পাই, তবে তিনি করেন এবং এটি কার্যকর হয়?
এই উদাহরণটিতে কোন থ্রেড অনফ্রেমকে কল করে তা জানার চেষ্টা করে আমি দু'দিন কাটিয়েছি তবে এটি খুঁজে পেলাম না কারণ এটি https://github.com/flutter-webrtc/libwebrtc ব্যবহার করে যা গুগলের ওয়েব্রটসি ব্যবহার করে: https://github.com/ জাম্পিংইয়াং 1001 / ওয়েব্র্টসি যা অনফ্রেমটি কোথা থেকে ডাকা হয়েছে তা খুঁজে পাওয়ার জন্য আমার পক্ষে খুব বড়। তবে এটি অবশ্যই আমাকে একটি সুতো থেকে নেওয়া উচিত। কিভাবে এটা সম্ভব?
flutter_controller.RunEventLoop()তাই MarkTextureFrameAvailableঅবশ্যই অন্য থ্রেড থেকে ডেকে আনতে হবে, যা অসম্ভব!
OnRenderহ'ল ফ্লুটারের ভার্চুয়াল ওভাররাইড তাই এটি ঝাঁকুনির থ্রেডের দ্বারা আহ্বান জানানো হয়।