স্তর এবং প্রদর্শন

লেয়ার এবং ডিসপ্লে হল দুটি আদিম যা কম্পোজিশন কাজ এবং ডিসপ্লে হার্ডওয়্যারের সাথে মিথস্ক্রিয়াকে প্রতিনিধিত্ব করে।

স্তর

একটি স্তর রচনার সবচেয়ে গুরুত্বপূর্ণ একক। একটি স্তর একটি পৃষ্ঠের সমন্বয় এবং SurfaceControl এর একটি উদাহরণ। প্রতিটি স্তরের বৈশিষ্ট্যগুলির একটি সেট রয়েছে যা সংজ্ঞায়িত করে কিভাবে এটি অন্যান্য স্তরগুলির সাথে মিথস্ক্রিয়া করে। স্তর বৈশিষ্ট্য নীচের টেবিলে বর্ণনা করা হয়েছে.

সম্পত্তি বর্ণনা
অবস্থানগত স্তরটি তার প্রদর্শনে কোথায় উপস্থিত হবে তা নির্ধারণ করে। তথ্য অন্তর্ভুক্ত করে যেমন একটি স্তরের প্রান্তের অবস্থান এবং অন্যান্য স্তরের সাথে সম্পর্কিত এর Z ক্রম (এটি অন্যান্য স্তরের সামনে বা পিছনে থাকা উচিত)।
বিষয়বস্তু অবস্থানগত বৈশিষ্ট্য দ্বারা সংজ্ঞায়িত সীমার মধ্যে স্তরে প্রদর্শিত বিষয়বস্তু কীভাবে উপস্থাপন করা উচিত তা নির্ধারণ করে। ক্রপ (স্তরের সীমানা পূরণ করতে সামগ্রীর একটি অংশ প্রসারিত করতে) এবং রূপান্তর (ঘোরানো বা ফ্লিপ করা সামগ্রী দেখানোর জন্য) এর মতো তথ্য অন্তর্ভুক্ত করে।
গঠন লেয়ারটিকে অন্যান্য লেয়ারের সাথে কিভাবে কম্পোজ করা উচিত তা নির্ধারণ করে। ব্লেন্ডিং মোড এবং আলফা সংমিশ্রণের জন্য একটি স্তর-বিস্তৃত আলফা মান এর মতো তথ্য অন্তর্ভুক্ত করে।
অপ্টিমাইজেশান লেয়ারটিকে সঠিকভাবে কম্পোজিট করার জন্য কঠোরভাবে প্রয়োজনীয় নয় এমন তথ্য প্রদান করে, তবে এটি হার্ডওয়্যার কম্পোজার (HWC) ডিভাইস দ্বারা এটি কীভাবে কম্পোজিশন সম্পাদন করে তা অপ্টিমাইজ করতে ব্যবহার করা যেতে পারে। স্তরটির দৃশ্যমান অঞ্চল এবং পূর্ববর্তী ফ্রেমের থেকে স্তরটির কোন অংশ আপডেট করা হয়েছে তার মতো তথ্য অন্তর্ভুক্ত করে৷

প্রদর্শন করে

একটি প্রদর্শন রচনা আরেকটি গুরুত্বপূর্ণ একক. একটি সিস্টেমে একাধিক ডিসপ্লে থাকতে পারে এবং স্বাভাবিক সিস্টেম অপারেশনের সময় ডিসপ্লে যোগ করা বা সরানো যেতে পারে। HWC এর অনুরোধে বা ফ্রেমওয়ার্কের অনুরোধে ডিসপ্লেগুলি যোগ/সরানো হয়। একটি বাহ্যিক ডিসপ্লে ডিভাইস থেকে সংযুক্ত বা সংযোগ বিচ্ছিন্ন হলে HWC ডিভাইস ডিসপ্লেগুলিকে যুক্ত বা সরানোর অনুরোধ করে, যাকে হটপ্লাগিং বলা হয়। ক্লায়েন্টরা ভার্চুয়াল ডিসপ্লেগুলির জন্য অনুরোধ করে, যার বিষয়বস্তুগুলি একটি শারীরিক প্রদর্শনের পরিবর্তে একটি অফ-স্ক্রীন বাফারে রেন্ডার করা হয়৷

ভার্চুয়াল ডিসপ্লে

SurfaceFlinger একটি অভ্যন্তরীণ ডিসপ্লে (ফোন বা ট্যাবলেটে অন্তর্নির্মিত), বাহ্যিক প্রদর্শন (যেমন HDMI এর মাধ্যমে সংযুক্ত একটি টেলিভিশন) এবং এক বা একাধিক ভার্চুয়াল ডিসপ্লে সমর্থন করে যা সিস্টেমের মধ্যে সংমিশ্রিত আউটপুট উপলব্ধ করে। ভার্চুয়াল ডিসপ্লেগুলি স্ক্রীন রেকর্ড করতে বা একটি নেটওয়ার্কের মাধ্যমে স্ক্রীন পাঠাতে ব্যবহার করা যেতে পারে। একটি ভার্চুয়াল প্রদর্শনের জন্য তৈরি ফ্রেমগুলি একটি বাফার কিউতে লেখা হয়।

ভার্চুয়াল ডিসপ্লেগুলি মূল ডিসপ্লে (লেয়ার স্ট্যাক) হিসাবে একই স্তরের সেট ভাগ করতে পারে বা তাদের নিজস্ব সেট থাকতে পারে। ভার্চুয়াল ডিসপ্লের জন্য কোন VSYNC নেই, তাই অভ্যন্তরীণ ডিসপ্লের জন্য VSYNC সমস্ত ডিসপ্লের জন্য কম্পোজিশন ট্রিগার করে।

HWC বাস্তবায়নে যেগুলি তাদের সমর্থন করে, ভার্চুয়াল ডিসপ্লেগুলি OpenGL ES (GLES), HWC, বা GLES এবং HWC উভয়ের সাথে সংমিশ্রিত হতে পারে। অসহায়ক বাস্তবায়নে, ভার্চুয়াল ডিসপ্লে সবসময় GLES ব্যবহার করে সংমিশ্রিত হয়।

কেস স্টাডি: স্ক্রিন রেকর্ড

screenrecord কমান্ড ব্যবহারকারীকে ডিস্কে .mp4 ফাইল হিসাবে পর্দায় প্রদর্শিত সমস্ত কিছু রেকর্ড করতে দেয়। এটি বাস্তবায়নের জন্য, সিস্টেমটি SurfaceFlinger থেকে সংমিশ্রিত ফ্রেমগুলি গ্রহণ করে, সেগুলিকে ভিডিও এনকোডারে লেখে এবং তারপর একটি ফাইলে এনকোড করা ভিডিও ডেটা লেখে৷ ভিডিও কোডেকগুলি একটি পৃথক প্রক্রিয়া ( mediaserver ) দ্বারা পরিচালিত হয়, তাই বড় গ্রাফিক্স বাফারগুলিকে সিস্টেমের চারপাশে ঘুরতে হয়। এটিকে আরও চ্যালেঞ্জিং করতে, লক্ষ্য হল পূর্ণ রেজোলিউশনে 60 fps ভিডিও রেকর্ড করা। এই কাজটি দক্ষতার সাথে করার মূল চাবিকাঠি হল BufferQueue.

MediaCodec ক্লাস একটি অ্যাপকে বাফারে বা পৃষ্ঠের মাধ্যমে কাঁচা বাইট হিসাবে ডেটা সরবরাহ করার অনুমতি দেয়। যখন screenrecord একটি ভিডিও এনকোডারে অ্যাক্সেসের অনুরোধ করে, তখন mediaserver প্রক্রিয়া একটি বাফারকিউ তৈরি করে, নিজেকে ভোক্তাদের সাথে সংযুক্ত করে, তারপর প্রযোজক পক্ষকে পৃষ্ঠ হিসাবে screenrecord ফিরিয়ে দেয়।

screenrecord ইউটিলিটি তারপর সারফেসফ্লিংগারকে একটি ভার্চুয়াল ডিসপ্লে তৈরি করতে বলে যা মূল ডিসপ্লেকে মিরর করে (অর্থাৎ, এটিতে একই স্তর রয়েছে), এবং mediaserver প্রক্রিয়া থেকে আসা পৃষ্ঠে আউটপুট পাঠানোর নির্দেশ দেয়। এই ক্ষেত্রে, সারফেসফ্লিংগার গ্রাহকের পরিবর্তে বাফারগুলির প্রযোজক।

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

কেস স্টাডি: সেকেন্ডারি ডিসপ্লে অনুকরণ করুন

WindowManager SurfaceFlinger কে একটি দৃশ্যমান স্তর তৈরি করতে বলতে পারে যার জন্য SurfaceFlinger BufferQueue ভোক্তা হিসেবে কাজ করে। SurfaceFlinger কে একটি ভার্চুয়াল ডিসপ্লে তৈরি করতে বলাও সম্ভব, যার জন্য SurfaceFlinger BufferQueue প্রযোজক হিসাবে কাজ করে।

আপনি যদি একটি দৃশ্যমান স্তরের সাথে একটি ভার্চুয়াল ডিসপ্লে সংযোগ করেন, একটি বন্ধ লুপ তৈরি করা হয় যেখানে একটি উইন্ডোতে সংমিশ্রিত পর্দা প্রদর্শিত হয়। সেই উইন্ডোটি এখন সংমিশ্রিত আউটপুটের অংশ, তাই পরবর্তী রিফ্রেশ করার সময় উইন্ডোর ভিতরে সংমিশ্রিত চিত্রটি উইন্ডোর বিষয়বস্তুও দেখায়। এটি কার্যকরভাবে দেখতে, সেটিংসে বিকাশকারী বিকল্পগুলি সক্ষম করুন, সেকেন্ডারি ডিসপ্লে সিমুলেট করুন নির্বাচন করুন এবং একটি উইন্ডো সক্ষম করুন৷ সেকেন্ডারি ডিসপ্লেগুলিকে অ্যাকশনে দেখতে, ডিসপ্লে সক্ষম করার কাজটি ক্যাপচার করতে screenrecord ব্যবহার করুন তারপর ফ্রেমে ফ্রেমে ব্যাক প্লে করুন।