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