লেয়ার এবং ডিসপ্লে হলো দুটি মৌলিক উপাদান যা কম্পোজিশনের কাজ এবং ডিসপ্লে হার্ডওয়্যারের সাথে মিথস্ক্রিয়াকে উপস্থাপন করে।
স্তর
একটি লেয়ার হলো গঠনের সবচেয়ে গুরুত্বপূর্ণ একক। একটি লেয়ার হলো একটি সারফেস এবং SurfaceControl এর একটি ইনস্ট্যান্সের সমন্বয়। প্রতিটি লেয়ারের কিছু প্রোপার্টি থাকে যা নির্ধারণ করে এটি অন্যান্য লেয়ারের সাথে কীভাবে মিথস্ক্রিয়া করে। লেয়ারের প্রোপার্টিগুলো নিম্নলিখিত সারণিতে বর্ণনা করা হলো:
| সম্পত্তি | বর্ণনা |
|---|---|
| অবস্থানগত | এটি নির্ধারণ করে যে লেয়ারটি ডিসপ্লেতে কোথায় প্রদর্শিত হবে। এর মধ্যে একটি লেয়ারের প্রান্তগুলির অবস্থান এবং অন্যান্য লেয়ারের সাপেক্ষে এর Z অর্ডারের (অর্থাৎ এটি অন্যান্য লেয়ারের সামনে থাকবে নাকি পিছনে) মতো তথ্য অন্তর্ভুক্ত থাকে। |
| বিষয়বস্তু | পজিশনাল প্রোপার্টি দ্বারা নির্ধারিত সীমার মধ্যে লেয়ারের কন্টেন্ট কীভাবে প্রদর্শিত হবে তা নির্দিষ্ট করে। এর মধ্যে রয়েছে ক্রপ (কন্টেন্টকে লেয়ারের সীমা পূরণ করার জন্য প্রসারিত করতে) এবং ট্রান্সফর্ম (ঘূর্ণিত বা উল্টানো কন্টেন্ট দেখানোর জন্য)। |
| গঠন | অন্যান্য লেয়ারের সাথে লেয়ারটিকে কীভাবে কম্পোজিট করা হবে তা নির্ধারণ করে। এতে ব্লেন্ডিং মোড এবং আলফা কম্পোজিটিং- এর জন্য লেয়ার-ব্যাপী আলফা মানের মতো তথ্য অন্তর্ভুক্ত থাকে। |
| অপ্টিমাইজেশন | এটি এমন তথ্য প্রদান করে যা সঠিক লেয়ার কম্পোজিশনের জন্য অপরিহার্য নয়, কিন্তু হার্ডওয়্যার কম্পোজার (HWC) ডিভাইস কম্পোজিশনের পারফরম্যান্স অপ্টিমাইজ করতে তা ব্যবহার করতে পারে। এর মধ্যে লেয়ারটির দৃশ্যমান অঞ্চল এবং পূর্ববর্তী ফ্রেমের পর থেকে আপডেট হওয়া অংশ অন্তর্ভুক্ত। |
প্রদর্শন
ডিসপ্লে হলো গঠনের আরেকটি গুরুত্বপূর্ণ একক। একটি সিস্টেমে একাধিক ডিসপ্লে থাকতে পারে এবং স্বাভাবিক সিস্টেম কার্যক্রম চলাকালীন ডিসপ্লে যোগ বা অপসারণ করা যায়। HWC-এর অনুরোধে অথবা ফ্রেমওয়ার্কের অনুরোধে ডিসপ্লে যোগ বা অপসারণ করা হয়।
যখন কোনো বাহ্যিক ডিসপ্লে ডিভাইসের সাথে সংযুক্ত বা বিচ্ছিন্ন করা হয়, তখন HWC ডিভাইসটি ডিসপ্লে যোগ বা অপসারণের অনুরোধ করে, যাকে হটপ্লাগিং বলা হয়। ক্লায়েন্টরা ভার্চুয়াল ডিসপ্লের অনুরোধ করে, যার বিষয়বস্তু কোনো ফিজিক্যাল ডিসপ্লেতে রেন্ডার না হয়ে একটি অফ-স্ক্রিন বাফারে রেন্ডার করা হয়।
ভার্চুয়াল ডিসপ্লে
সারফেসফ্লিঙ্গার একটি অভ্যন্তরীণ ডিসপ্লে (ফোন বা ট্যাবলেটে অন্তর্নির্মিত), বাহ্যিক ডিসপ্লে (যেমন HDMI-এর মাধ্যমে সংযুক্ত টেলিভিশন), এবং এক বা একাধিক ভার্চুয়াল ডিসপ্লে সমর্থন করে, যা সিস্টেমের মধ্যেই কম্পোজিটেড আউটপুট উপলব্ধ করে। ভার্চুয়াল ডিসপ্লে স্ক্রিন রেকর্ড করতে বা নেটওয়ার্কের মাধ্যমে স্ক্রিন পাঠাতে ব্যবহার করা যেতে পারে। একটি ভার্চুয়াল ডিসপ্লের জন্য তৈরি ফ্রেমগুলো একটি বাফারকিউ-তে লেখা হয়।
ভার্চুয়াল ডিসপ্লেগুলো মূল ডিসপ্লের মতোই একই লেয়ার সেট (লেয়ার স্ট্যাক) ব্যবহার করতে পারে অথবা তাদের নিজস্ব লেয়ার সেট থাকতে পারে। ভার্চুয়াল ডিসপ্লের জন্য কোনো VSync থাকে না, তাই অভ্যন্তরীণ ডিসপ্লের VSync-ই সমস্ত ডিসপ্লের কম্পোজিশন প্রক্রিয়া চালু করে।
যেসব HWC ইমপ্লিমেন্টেশন সমর্থন করে, সেগুলোতে ভার্চুয়াল ডিসপ্লে OpenGL ES (GLES), HWC, অথবা GLES ও HWC উভয় দিয়েই কম্পোজিট করা যায়। যেসব ইমপ্লিমেন্টেশন এটি সমর্থন করে না, সেগুলোতে ভার্চুয়াল ডিসপ্লে সবসময় GLES ব্যবহার করে কম্পোজিট করা হয়।
কেস স্টাডি: স্ক্রিনরেকর্ড
screenrecord কমান্ড ব্যবহারকারীকে স্ক্রিনে যা কিছু দেখা যায়, তার সবকিছু ডিস্কে একটি MP4 ফাইল হিসেবে রেকর্ড করার সুযোগ দেয়। এটি বাস্তবায়নের জন্য, সিস্টেম সারফেসফ্লিঙ্গার (SurfaceFlinger) থেকে কম্পোজিট করা ফ্রেম গ্রহণ করে, সেগুলোকে ভিডিও এনকোডারে লেখে এবং তারপর এনকোড করা ভিডিও ডেটা একটি ফাইলে লিখে দেয়। ভিডিও কোডেকগুলো একটি আলাদা প্রসেস ( mediaserver ) দ্বারা পরিচালিত হয়, তাই বড় গ্রাফিক্স বাফারগুলোকে সিস্টেমের মধ্যে চলাচল করতে হয়। কাজটিকে আরও চ্যালেঞ্জিং করে তোলে পূর্ণ রেজোলিউশনে ৬০ এফপিএস (fps) ভিডিও রেকর্ড করার লক্ষ্য। এই কাজটি দক্ষতার সাথে সম্পন্ন করার মূল চাবিকাঠি হলো বাফারকিউ (BufferQueue)।
MediaCodec ক্লাসটি একটি অ্যাপকে বাফারে র ডেটা বাইট হিসেবে, অথবা একটি সারফেসের মাধ্যমে ডেটা সরবরাহ করার সুযোগ দেয়। যখন screenrecord একটি ভিডিও এনকোডারে অ্যাক্সেসের জন্য অনুরোধ করে, তখন mediaserver প্রসেসটি একটি BufferQueue তৈরি করে, কনজিউমার সাইডের সাথে নিজেকে সংযুক্ত করে, এবং তারপর প্রডিউসার সাইডটিকে একটি সারফেস হিসেবে screenrecord কাছে ফেরত পাঠায়।
এরপর screenrecord ইউটিলিটি সারফেসফ্লিঙ্গারকে একটি ভার্চুয়াল ডিসপ্লে তৈরি করতে বলে যা মূল ডিসপ্লেটির প্রতিচ্ছবি (অর্থাৎ, এতে একই লেয়ারগুলো থাকে), এবং mediaserver প্রসেস থেকে আসা আউটপুটটি সারফেসে পাঠাতে নির্দেশ দেয়। এক্ষেত্রে, সারফেসফ্লিঙ্গার বাফারের ভোক্তা না হয়ে উৎপাদক হিসেবে কাজ করে।
কনফিগারেশন সম্পূর্ণ হওয়ার পর, এনকোড করা ডেটা প্রদর্শিত হলে screenrecord চালু হয়। অ্যাপগুলো যখন ড্র করে, তখন তাদের বাফারগুলো সারফেসফ্লিঙ্গারে যায়, যা সেগুলোকে একত্রিত করে একটি একক বাফার তৈরি করে এবং সেটি সরাসরি mediaserver প্রসেসের ভিডিও এনকোডারে পাঠিয়ে দেয়। screenrecord প্রসেসটি কখনোই সম্পূর্ণ ফ্রেমগুলো দেখতে পায় না। অভ্যন্তরীণভাবে, mediaserver প্রসেসের বাফার স্থানান্তরের নিজস্ব একটি পদ্ধতি রয়েছে যা হ্যান্ডেলের মাধ্যমে ডেটা প্রেরণ করে, ফলে ওভারহেড কমে যায়।
কেস স্টাডি: সেকেন্ডারি ডিসপ্লে সিমুলেট করা
উইন্ডো ম্যানেজার, সারফেসফ্লিঙ্গারকে একটি দৃশ্যমান লেয়ার তৈরি করতে বলতে পারে, যার জন্য সারফেসফ্লিঙ্গার বাফার কিউ কনজিউমার হিসেবে কাজ করে। এছাড়াও, সারফেসফ্লিঙ্গারকে একটি ভার্চুয়াল ডিসপ্লে তৈরি করতে বলা সম্ভব, যার জন্য সারফেসফ্লিঙ্গার বাফার কিউ প্রডিউসার হিসেবে কাজ করে।
যদি আপনি একটি ভার্চুয়াল ডিসপ্লেকে একটি দৃশ্যমান লেয়ারের সাথে সংযুক্ত করেন, তাহলে একটি ক্লোজড লুপ তৈরি হয় যেখানে কম্পোজিট করা স্ক্রিনটি একটি উইন্ডোতে প্রদর্শিত হয়। সেই উইন্ডোটি এখন কম্পোজিট করা আউটপুটের একটি অংশ, তাই পরবর্তী রিফ্রেশে উইন্ডোর ভেতরের কম্পোজিট করা ছবিটিতেও উইন্ডোর বিষয়বস্তু দেখা যায়। এটি বাস্তবে দেখতে, সেটিংস -এ ডেভেলপার অপশন চালু করুন, ‘সিমুলেট সেকেন্ডারি ডিসপ্লেস’ নির্বাচন করুন এবং একটি উইন্ডো চালু করুন। সেকেন্ডারি ডিসপ্লেগুলো বাস্তবে দেখতে, screenrecord ব্যবহার করে ডিসপ্লেটি চালু করার মুহূর্তটি ক্যাপচার করুন এবং তারপর ফ্রেম বাই ফ্রেম প্লেব্যাক করুন।