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

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

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

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

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

অ্যান্ড্রয়েড ১০ দিয়ে শুরু করে, 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 Window অবজেক্টগুলিকে নিয়ন্ত্রণ করে, যা View অবজেক্টের জন্য কন্টেইনার। Window অবজেক্টগুলি সর্বদা Surface অবজেক্ট দ্বারা সমর্থিত হয়। WindowManager একটি উইন্ডোর জীবনচক্র, ইনপুট এবং ফোকাস ইভেন্ট, স্ক্রিন ওরিয়েন্টেশন, ট্রানজিশন, অ্যানিমেশন, অবস্থান, রূপান্তর, z-অর্ডার এবং অন্যান্য অনেক দিক তত্ত্বাবধান করে। WindowManager সমস্ত উইন্ডো মেটাডেটা SurfaceFlinger-এ পাঠায় যাতে SurfaceFlinger সেই ডেটা ব্যবহার করে ডিসপ্লেতে থাকা সারফেসগুলিকে কম্পোজিট করতে পারে।

প্রাক-ঘূর্ণন

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

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