সারফেসফ্লিংগার এবং উইন্ডো ম্যানেজার

SurfaceFlinger বাফার গ্রহণ করে, বাফার রচনা করে এবং ডিসপ্লেতে বাফার পাঠায়। WindowManager বাফার এবং উইন্ডো মেটাডেটা সহ SurfaceFlinger প্রদান করে, যা SurfaceFlinger ডিসপ্লেতে কম্পোজিট সারফেস ব্যবহার করে।

সারফেসফ্লিংগার

SurfaceFlinger দুটি উপায়ে বাফার গ্রহণ করতে পারে: BufferQueue এবং SurfaceControl মাধ্যমে, অথবা ASurfaceControl মাধ্যমে।

SurfaceFlinger বাফার গ্রহণ করার একটি উপায় হল BufferQueue এবং SurfaceControl মাধ্যমে। যখন একটি অ্যাপ অগ্রভাগে আসে, তখন এটি WindowManager থেকে বাফারের অনুরোধ করে। WindowManager তারপর SurfaceFlinger থেকে একটি স্তর অনুরোধ করে। একটি স্তর হল একটি পৃষ্ঠের সংমিশ্রণ, যাতে রয়েছে BufferQueue এবং একটি SurfaceControl উদাহরণ, যাতে ডিসপ্লে ফ্রেমের মতো স্তর মেটাডেটা থাকে। SurfaceFlinger লেয়ার তৈরি করে এবং WindowManager এ পাঠায়। WindowManager তারপর অ্যাপে সারফেস পাঠায়, কিন্তু স্ক্রীনে অ্যাপের চেহারা ম্যানিপুলেট করার জন্য SurfaceControl ইনস্ট্যান্স রাখে।

অ্যান্ড্রয়েড 10 ASurfaceControl যোগ করে, যা অন্য একটি উপায় যা SurfaceFlinger বাফারগুলি গ্রহণ করতে পারে। ASurfaceControl একটি সারফেস এবং একটি SurfaceControl ইনস্ট্যান্সকে একটি লেনদেন প্যাকেজে একত্রিত করে যা SurfaceFlinger-এ পাঠানো হয়। ASurfaceControl একটি স্তরের সাথে যুক্ত, যা অ্যাপগুলি ASurfaceTransaction দৃষ্টান্তগুলির মাধ্যমে আপডেট করে। অ্যাপগুলি তখন কলব্যাকের মাধ্যমে ASurfaceTransaction দৃষ্টান্ত সম্পর্কে তথ্য পায় যা ASurfaceTransactionStats সম্বলিত তথ্য, যেমন ল্যাচ টাইম, অর্জনের সময় ইত্যাদি পাস করে।

নিম্নলিখিত টেবিলে ASurfaceControl এবং এর সাথে সম্পর্কিত উপাদানগুলি সম্পর্কে আরও বিশদ রয়েছে:

কম্পোনেন্ট বর্ণনা
ASurfaceControl SurfaceControl মোড়ানো হয় এবং ডিসপ্লেতে স্তরগুলির সাথে সামঞ্জস্যপূর্ণ SurfaceControl দৃষ্টান্ত তৈরি করতে একটি অ্যাপকে সক্ষম করে৷

ANativeWindow এর সন্তান বা অন্য ASurfaceControl উদাহরণের সন্তান হিসাবে তৈরি করা যেতে পারে।
ASurfaceTransaction জ্যামিতির মতো একটি স্তরের বর্ণনামূলক বৈশিষ্ট্য সম্পাদনা করতে ক্লায়েন্টকে সক্ষম করতে Transaction মোড়ানো হয় এবং আপডেট করা বাফারগুলিকে SurfaceFlinger-এ পাঠায়।
ASurfaceTransactionStats একটি প্রাক-নিবন্ধিত কলব্যাকের মাধ্যমে একটি অ্যাপে উপস্থাপিত লেনদেন সম্পর্কে তথ্য পাঠায়, যেমন ল্যাচ টাইম, অধিগ্রহণের সময় এবং পূর্ববর্তী প্রকাশের বেড়া।

যদিও অ্যাপগুলি যেকোন সময় বাফার জমা দিতে পারে, সারফেসফ্লিংগার শুধুমাত্র ডিসপ্লে রিফ্রেশের মধ্যে বাফারগুলি গ্রহণ করার জন্য জেগে ওঠে, যা ডিভাইসের উপর নির্ভর করে ভিন্ন হতে পারে। এটি মেমরির ব্যবহার কমিয়ে দেয় এবং স্ক্রীনে দৃশ্যমান ছিঁড়ে যাওয়া এড়ায়, যা ডিসপ্লে মিড-রিফ্রেশ আপডেট করার সময় ঘটতে পারে।

যখন ডিসপ্লেটি রিফ্রেশের মধ্যে থাকে, তখন ডিসপ্লে সারফেসফ্লিংগারে VSync সংকেত পাঠায়। VSync সংকেত নির্দেশ করে যে প্রদর্শনটি ছিঁড়ে না গিয়ে রিফ্রেশ করা যেতে পারে। যখন SurfaceFlinger VSync সংকেত পায়, SurfaceFlinger তার স্তরগুলির তালিকার মধ্য দিয়ে নতুন বাফারের সন্ধান করে। যদি SurfaceFlinger একটি নতুন বাফার খুঁজে পায়, SurfaceFlinger বাফার অর্জন করে; যদি না হয়, SurfaceFlinger পূর্বে অর্জিত বাফার ব্যবহার করা অব্যাহত রাখে। SurfaceFlinger সর্বদা কিছু প্রদর্শন করতে হবে, তাই এটি একটি বাফারে ঝুলে থাকে। কোনো স্তরে কোনো বাফার জমা না থাকলে, স্তরটি উপেক্ষা করা হয়।

সারফেসফ্লিংগার দৃশ্যমান স্তরগুলির জন্য সমস্ত বাফার সংগ্রহ করার পরে, এটি হার্ডওয়্যার কম্পোজারকে (HWC) জিজ্ঞাসা করে যে কীভাবে রচনাটি সম্পাদন করা উচিত। যদি HWC লেয়ার কম্পোজিশন টাইপকে ক্লায়েন্ট কম্পোজিশন হিসেবে চিহ্নিত করে, SurfaceFlinger সেই লেয়ারগুলোকে কম্পোজ করে। তারপর, SurfaceFlinger HWC- তে আউটপুট বাফার পাস করে।

উইন্ডো ম্যানেজার

WindowManager Window অবজেক্ট নিয়ন্ত্রণ করে, যেগুলো View অবজেক্টের জন্য কন্টেইনার। Window অবজেক্ট সবসময় Surface অবজেক্ট দ্বারা সমর্থিত হয়। WindowManager লাইফসাইকেল, ইনপুট এবং ফোকাস ইভেন্ট, স্ক্রিন ওরিয়েন্টেশন, ট্রানজিশন, অ্যানিমেশন, পজিশন, ট্রান্সফর্ম, জেড-অর্ডার এবং উইন্ডোর অন্যান্য অনেক দিক তত্ত্বাবধান করে। WindowManager সমস্ত উইন্ডো মেটাডেটা SurfaceFlinger-এ পাঠায় যাতে SurfaceFlinger সেই ডেটা ডিসপ্লেতে কম্পোজিট সারফেসে ব্যবহার করতে পারে।

প্রাক ঘূর্ণন

অনেক হার্ডওয়্যার ওভারলে ঘূর্ণন সমর্থন করে না (এবং এমনকি যদি তারা করে, এটি প্রক্রিয়াকরণ শক্তি খরচ করে); সমাধান হল বাফারটিকে সারফেসফ্লিংগারে পৌঁছানোর আগে রূপান্তর করা। সারফেসফ্লিঙ্গার দ্বারা বাফারে প্রয়োগ করার সম্ভাব্য রূপান্তর উপস্থাপন করার জন্য Android ANativeWindow এ একটি কোয়েরি ইঙ্গিত ( NATIVE_WINDOW_TRANSFORM_HINT ) সমর্থন করে৷ GL ড্রাইভাররা SurfaceFlinger-এ পৌঁছানোর আগে বাফারটিকে প্রি-ট্রান্সফর্ম করতে এই ইঙ্গিতটি ব্যবহার করতে পারে যাতে বাফারটি পৌঁছলে এটি সঠিকভাবে রূপান্তরিত হয়।

উদাহরণস্বরূপ, 90 ডিগ্রী ঘোরানোর জন্য একটি ইঙ্গিত পাওয়ার সময়, বাফারে একটি ম্যাট্রিক্স তৈরি করুন এবং প্রয়োগ করুন যাতে এটি পৃষ্ঠার শেষ থেকে বন্ধ হয়ে যায়। শক্তি সঞ্চয় করতে, এই প্রি-রোটেশন করুন। বিস্তারিত জানার জন্য, system/core/include/system/window.h এ সংজ্ঞায়িত ANativeWindow ইন্টারফেস দেখুন।