SurfaceFlinger ও WindowManager

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

SurfaceFlinger

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

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

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

নিচের সারণীতে ASurfaceControl ও এর সম্পর্কিত কম্পোনেন্ট সম্পর্কে বর্ণনা করা হয়েছে:

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

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

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

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

WindowManager

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

প্রি-রোটেশন

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

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