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

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

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

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

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

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

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

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

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

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

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

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

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

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

পূর্ব ঘূর্ণন

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

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