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