সারফেসফ্লিঙ্গার বাফার গ্রহণ করে, সেগুলোকে একত্রিত করে এবং ডিসপ্লেতে পাঠায়। WindowManager সারফেসফ্লিঙ্গারকে বাফার এবং উইন্ডো মেটাডেটা সরবরাহ করে, যা ব্যবহার করে সারফেসফ্লিঙ্গার পরবর্তীতে ডিসপ্লেতে সারফেসগুলো একত্রিত করে।
সারফেসফ্লিঙ্গার
SurfaceFlinger দুইভাবে বাফার গ্রহণ করতে পারে: BufferQueue এবং SurfaceControl মাধ্যমে, অথবা ASurfaceControl মাধ্যমে।
SurfaceFlinger যে উপায়ে বাফার গ্রহণ করে, তার একটি হলো BufferQueue এবং SurfaceControl । যখন কোনো অ্যাপ ফোরগ্রাউন্ডে আসে, তখন এটি WindowManager কাছে বাফারের জন্য অনুরোধ করে। এরপর WindowManager SurfaceFlinger-এর কাছে একটি লেয়ারের জন্য অনুরোধ করে। একটি লেয়ার হলো একটি সারফেস (যেটিতে BufferQueue থাকে) এবং একটি SurfaceControl ইনস্ট্যান্সের (যেটিতে ডিসপ্লে ফ্রেমের মতো লেয়ারের মেটাডেটা থাকে) সমন্বয়। SurfaceFlinger লেয়ারটি তৈরি করে WindowManager কাছে পাঠিয়ে দেয়। এরপর WindowManager সারফেসটি অ্যাপে পাঠিয়ে দেয়, কিন্তু স্ক্রিনে অ্যাপটির চেহারা নিয়ন্ত্রণ করার জন্য SurfaceControl ইনস্ট্যান্সটি নিজের কাছে রেখে দেয়।
অ্যান্ড্রয়েড ১০ থেকে শুরু করে, ASurfaceControl সারফেসফ্লিঙ্গারকে বাফার গ্রহণ করার জন্য আরেকটি উপায় প্রদান করে। ASurfaceControl একটি সারফেস এবং একটি SurfaceControl ইনস্ট্যান্সকে একটি একক ট্রানজ্যাকশন প্যাকেজে একত্রিত করে, যা সারফেসফ্লিঙ্গার গ্রহণ করে। ASurfaceControl একটি লেয়ারের সাথে যুক্ত থাকে, যা অ্যাপগুলো ASurfaceTransaction ইনস্ট্যান্সের মাধ্যমে আপডেট করে। এরপর অ্যাপগুলো কলব্যাকের মাধ্যমে ASurfaceTransaction ইনস্ট্যান্সগুলো সম্পর্কে তথ্য পায়, যা ASurfaceTransactionStats পাস করে এবং এতে ল্যাচ টাইম, অ্যাকোয়ার টাইমের মতো তথ্য থাকে।
নিম্নলিখিত সারণিতে ASurfaceControl এবং এর সংশ্লিষ্ট উপাদানগুলো বর্ণনা করা হয়েছে:
| উপাদান | বর্ণনা |
|---|---|
ASurfaceControl | SurfaceControl আবৃত করে এবং একটি অ্যাপকে ডিসপ্লেতে থাকা লেয়ারগুলোর সাথে সঙ্গতিপূর্ণ SurfaceControl ইনস্ট্যান্স তৈরি করতে দেয়।একে ANativeWindow এর চাইল্ড হিসেবে অথবা অন্য কোনো ASurfaceControl ইনস্ট্যান্সের চাইল্ড হিসেবে তৈরি করা যেতে পারে। |
ASurfaceTransaction | ক্লায়েন্টকে একটি লেয়ারের জ্যামিতির মতো বর্ণনামূলক বৈশিষ্ট্যগুলো সম্পাদনা করার সুযোগ দিতে এবং আপডেট করা বাফারগুলো সারফেসফ্লিঙ্গার-এ পাঠানোর জন্য এটি Transaction র্যাপ করে। |
ASurfaceTransactionStats | পূর্ব-নিবন্ধিত একটি কলব্যাকের মাধ্যমে, উপস্থাপিত লেনদেন সম্পর্কিত তথ্য, যেমন ল্যাচ টাইম, অ্যাকোয়ার টাইম এবং পূর্ববর্তী রিলিজ ফেন্স, একটি অ্যাপে প্রেরণ করে। |
যদিও অ্যাপগুলো যেকোনো সময় বাফার জমা দিতে পারে, সারফেসফ্লিঙ্গার শুধুমাত্র ডিসপ্লে রিফ্রেশের মধ্যবর্তী সময়ে বাফার গ্রহণ করার জন্য সক্রিয় হয়, যা ডিভাইসভেদে ভিন্ন হতে পারে। এটি মেমোরির ব্যবহার কমায় এবং স্ক্রিনে দৃশ্যমান টিয়ারিং এড়ায়, যা রিফ্রেশের মাঝপথে ডিসপ্লে আপডেট করার সময় ঘটতে পারে।
যখন ডিসপ্লে রিফ্রেশের মধ্যবর্তী সময়ে থাকে, তখন এটি সারফেসফ্লিঙ্গারকে (SurfaceFlinger) VSync সিগন্যাল পাঠায়। VSync সিগন্যালটি নির্দেশ করে যে এটি টিয়ারিং ছাড়াই ডিসপ্লে রিফ্রেশ করতে পারে। যখন সারফেসফ্লিঙ্গার VSync সিগন্যালটি গ্রহণ করে, তখন এটি নতুন বাফারের খোঁজে তার লেয়ারের তালিকা ধরে এগোতে থাকে। যদি এটি একটি নতুন বাফার খুঁজে পায়, তবে সারফেসফ্লিঙ্গার সেই বাফারটি অধিগ্রহণ করে; আর যদি না পায়, তবে এটি পূর্বে অধিগ্রহণ করা বাফারটিই ব্যবহার করতে থাকে। সারফেসফ্লিঙ্গারকে সবসময় কিছু না কিছু প্রদর্শন করতেই হয়, তাই এটি একটি বাফার ধরে রাখে। যদি কোনো লেয়ারে কখনও কোনো বাফার জমা না দেওয়া হয়ে থাকে, তবে সারফেসফ্লিঙ্গার সেই লেয়ারটিকে উপেক্ষা করে।
SurfaceFlinger দৃশ্যমান লেয়ারগুলোর জন্য সমস্ত বাফার সংগ্রহ করার পর, এটি হার্ডওয়্যার কম্পোজার (HWC)-কে জিজ্ঞাসা করে যে কীভাবে কম্পোজিশন সম্পাদন করা উচিত। যদি HWC লেয়ার কম্পোজিশনের ধরণকে ক্লায়েন্ট কম্পোজিশন হিসেবে চিহ্নিত করে, তাহলে SurfaceFlinger সেই লেয়ারগুলোকে কম্পোজিট করে। এরপর, SurfaceFlinger আউটপুট বাফারটি HWC- এর কাছে পাঠিয়ে দেয়।
উইন্ডোম্যানেজার
WindowManager Window অবজেক্ট নিয়ন্ত্রণ করে, যা View অবজেক্টের ধারক হিসেবে কাজ করে। Window অবজেক্টগুলো সর্বদা Surface অবজেক্ট দ্বারা সমর্থিত থাকে। WindowManager একটি উইন্ডোর লাইফসাইকেল, ইনপুট ও ফোকাস ইভেন্ট, স্ক্রিন ওরিয়েন্টেশন, ট্রানজিশন, অ্যানিমেশন, পজিশন, ট্রান্সফর্ম, জেড-অর্ডার এবং আরও অনেক দিক তত্ত্বাবধান করে। WindowManager উইন্ডোর সমস্ত মেটাডেটা সারফেসফ্লিঙ্গারের কাছে পাঠায়, যাতে সারফেসফ্লিঙ্গার সেই ডেটা ব্যবহার করে ডিসপ্লেতে সারফেস কম্পোজিট করতে পারে।
প্রাক-ঘূর্ণন
অনেক হার্ডওয়্যার ওভারলে রোটেশন সমর্থন করে না (এবং করলেও, এর জন্য প্রসেসিং পাওয়ার খরচ হয়); এর সমাধান হলো বাফারটিকে SurfaceFlinger-এ পৌঁছানোর আগেই ট্রান্সফর্ম করা। অ্যান্ড্রয়েড ANativeWindow তে একটি কোয়েরি হিন্ট ( NATIVE_WINDOW_TRANSFORM_HINT ) সমর্থন করে, যা নির্দেশ করে যে SurfaceFlinger বাফারটির উপর সম্ভবত কোন ট্রান্সফর্মটি প্রয়োগ করবে। GL ড্রাইভারগুলো এই হিন্ট ব্যবহার করে বাফারটিকে SurfaceFlinger-এ পৌঁছানোর আগেই প্রি-ট্রান্সফর্ম করতে পারে, যাতে বাফারটি যখন পৌঁছায়, তখন তা সঠিকভাবে ট্রান্সফর্ম করা থাকে।
উদাহরণস্বরূপ, ৯০ ডিগ্রি ঘোরানোর জন্য কোনো ইঙ্গিত পেলে, বাফারটি যাতে পৃষ্ঠার শেষ প্রান্তের বাইরে চলে না যায়, সেজন্য একটি ম্যাট্রিক্স তৈরি করে তাতে প্রয়োগ করুন। শক্তি সাশ্রয়ের জন্য, এই কাজটি ঘোরানোর আগেই করুন। বিস্তারিত জানতে, system/core/include/system/window.h এ সংজ্ঞায়িত ANativeWindow ইন্টারফেসটি দেখুন।