BufferQueue এবং Gralloc

BufferQueue ক্লাস এমন উপাদানগুলিকে সংযুক্ত করে যা গ্রাফিকাল ডেটা ( উৎপাদকদের ) বাফার তৈরি করে এমন উপাদানগুলির সাথে যা প্রদর্শন বা আরও প্রক্রিয়াকরণের ( ভোক্তাদের ) জন্য ডেটা গ্রহণ করে। সিস্টেমের মাধ্যমে গ্রাফিকাল ডেটার বাফারগুলি সরানো প্রায় সবকিছুই BufferQueue-এর উপর নির্ভর করে।

Gralloc মেমরি বরাদ্দকারী বাফার বরাদ্দ করে এবং দুটি বিক্রেতা-নির্দিষ্ট HIDL ইন্টারফেসের মাধ্যমে প্রয়োগ করা হয় ( hardware/interfaces/graphics/allocator/ এবং hardware/interfaces/graphics/mapper/ দেখুন)। allocate() ফাংশন প্রত্যাশিত আর্গুমেন্ট (প্রস্থ, উচ্চতা, পিক্সেল বিন্যাস) এবং সেইসাথে ব্যবহারের পতাকাগুলির একটি সেট নেয়।

বাফার কিউ প্রযোজক এবং ভোক্তা

ভোক্তারা BufferQueue ডেটা স্ট্রাকচার তৈরি করে এবং তার মালিকানা রাখে এবং তাদের প্রযোজকদের তুলনায় বিভিন্ন প্রক্রিয়ায় বিদ্যমান থাকতে পারে। যখন একজন প্রযোজকের একটি বাফারের প্রয়োজন হয়, তখন এটি dequeueBuffer() কল করে বাফারের প্রস্থ, উচ্চতা, পিক্সেল বিন্যাস এবং ব্যবহারের ফ্ল্যাগ উল্লেখ করে BufferQueue থেকে একটি বিনামূল্যের বাফারের অনুরোধ করে। প্রযোজক তারপরে বাফারটি পূরণ করে এবং queueBuffer() কল করে বাফারটিকে সারিতে ফিরিয়ে দেয়। এরপরে, ভোক্তা acquireBuffer() দিয়ে বাফারটি অর্জন করে এবং বাফার বিষয়বস্তু ব্যবহার করে। ভোক্তা হয়ে গেলে, এটি releaseBuffer() কল করে বাফারটিকে সারিতে ফিরিয়ে দেয়। সিঙ্ক ফ্রেমওয়ার্ক নিয়ন্ত্রণ করে কিভাবে বাফারগুলি Android গ্রাফিক্স পাইপলাইনের মধ্য দিয়ে চলে।

BufferQueue-এর কিছু বৈশিষ্ট্য, যেমন এটি ধারণ করতে পারে সর্বোচ্চ সংখ্যক বাফার, প্রযোজক এবং ভোক্তার দ্বারা যৌথভাবে নির্ধারিত হয়। যাইহোক, BufferQueue বাফার বরাদ্দ করে যেমন এটির প্রয়োজন হয়। বৈশিষ্ট্য পরিবর্তন না হলে বাফারগুলি বজায় রাখা হয়; উদাহরণস্বরূপ, যদি একজন প্রযোজক একটি ভিন্ন আকারের বাফারের জন্য অনুরোধ করে, তাহলে পুরানো বাফারগুলিকে মুক্ত করা হয় এবং চাহিদা অনুযায়ী নতুন বাফারগুলি বরাদ্দ করা হয়।

বাফার বিষয়বস্তু BufferQueue দ্বারা কখনই অনুলিপি করা হয় না, কারণ এত বেশি ডেটা চারদিকে সরানো অদক্ষ। পরিবর্তে, বাফার সবসময় একটি হ্যান্ডেল দ্বারা পাস করা হয়.

সিস্ট্রেস দিয়ে বাফার কিউ ট্র্যাক করুন

গ্রাফিক্স বাফারগুলি কীভাবে ঘুরে বেড়ায় তা বোঝার জন্য, Systrace ব্যবহার করুন, একটি টুল যা অল্প সময়ের মধ্যে ডিভাইসের কার্যকলাপ রেকর্ড করে। সিস্টেম-স্তরের গ্রাফিক্স কোডটি ভালভাবে তৈরি করা হয়েছে, যেমনটি প্রাসঙ্গিক অ্যাপ ফ্রেমওয়ার্ক কোডের মতো।

Systrace ব্যবহার করতে, gfx , view এবং sched ট্যাগ সক্রিয় করুন। BufferQueue অবজেক্ট ট্রেসে প্রদর্শিত হয়। উদাহরণ হিসেবে, গ্রাফিকার প্লে ভিডিও (সারফেসভিউ) চলাকালীন আপনি যদি একটি ট্রেস নেন, সারফেসভিউ লেবেলযুক্ত সারিটি আপনাকে বলে যে কোন নির্দিষ্ট সময়ে কতগুলি বাফার সারিবদ্ধ ছিল।

অ্যাপটি সক্রিয় থাকাকালীন মান বৃদ্ধি পায়, যা মিডিয়াকোডেক ডিকোডার দ্বারা ফ্রেমের রেন্ডারিংকে ট্রিগার করে। SurfaceFlinger যখন কাজ করছে এবং বাফার ব্যবহার করছে তখন মান হ্রাস পায়। 30 fps এ ভিডিও দেখানোর সময়, সারির মান 0 থেকে 1 পর্যন্ত পরিবর্তিত হয় কারণ ~60 fps ডিসপ্লে উৎসের সাথে তাল মিলিয়ে চলতে পারে। সারফেসফ্লিংগার তখনই জেগে ওঠে যখন কাজ করতে হয়, প্রতি সেকেন্ডে 60 বার নয়। সিস্টেম কাজ এড়াতে চেষ্টা করে এবং যদি কিছুই স্ক্রীন আপডেট না করে তাহলে VSYNC অক্ষম করে।

আপনি যদি Grafika's Play ভিডিওতে (টেক্সচারভিউ) স্যুইচ করেন এবং একটি নতুন ট্রেস নেন, আপনি com.android.grafika / com.android.grafika.PlayMovieActivity লেবেলযুক্ত একটি সারি দেখতে পাবেন। এটি হল প্রধান UI স্তর, যা অন্য একটি BufferQueue। যেহেতু TextureView একটি পৃথক স্তরের পরিবর্তে UI স্তরে রেন্ডার করে, সমস্ত ভিডিও-চালিত আপডেটগুলি এখানে প্রদর্শিত হয়৷

গ্র্যালোক

Gralloc বরাদ্দকারী HAL hardware/libhardware/include/hardware/gralloc.h ব্যবহার ফ্ল্যাগের মাধ্যমে বাফার বরাদ্দ করে। ব্যবহারের পতাকাগুলির মধ্যে বৈশিষ্ট্যগুলি অন্তর্ভুক্ত রয়েছে যেমন:

  • সফ্টওয়্যার (CPU) থেকে কত ঘন ঘন মেমরি অ্যাক্সেস করা হবে
  • হার্ডওয়্যার (GPU) থেকে কত ঘন ঘন মেমরি অ্যাক্সেস করা হবে
  • মেমরিটি OpenGL ES (GLES) টেক্সচার হিসাবে ব্যবহার করা হবে কিনা
  • ভিডিও এনকোডার দ্বারা মেমরি ব্যবহার করা হবে কিনা

উদাহরণস্বরূপ, যদি একটি প্রযোজকের বাফার বিন্যাস RGBA_8888 পিক্সেল নির্দিষ্ট করে এবং প্রযোজক নির্দেশ করে যে বাফারটি সফ্টওয়্যার থেকে অ্যাক্সেস করা হবে (অর্থাৎ একটি অ্যাপ CPU-তে পিক্সেল স্পর্শ করবে), Gralloc RGBA ক্রমানুসারে পিক্সেল প্রতি 4 বাইট সহ একটি বাফার তৈরি করে। পরিবর্তে, যদি একটি প্রযোজক নির্দিষ্ট করে তার বাফার শুধুমাত্র হার্ডওয়্যার থেকে অ্যাক্সেস করা হবে এবং একটি GLES টেক্সচার হিসাবে, Gralloc GLES ড্রাইভার যা চায় তা করতে পারে, যেমন BGRA অর্ডারিং, ননলাইনার সুইজড লেআউট এবং বিকল্প রঙের বিন্যাস। হার্ডওয়্যারটিকে তার পছন্দের বিন্যাসটি ব্যবহার করার অনুমতি দিলে কর্মক্ষমতা উন্নত হতে পারে।

কিছু মান নির্দিষ্ট প্ল্যাটফর্মে একত্রিত করা যাবে না। উদাহরণস্বরূপ, ভিডিও এনকোডার পতাকার জন্য YUV পিক্সেলের প্রয়োজন হতে পারে, তাই সফ্টওয়্যার অ্যাক্সেস যোগ করা এবং RGBA_8888 নির্দিষ্ট করা ব্যর্থ হয়।

Gralloc দ্বারা প্রত্যাবর্তিত হ্যান্ডেলটি বাইন্ডারের মাধ্যমে প্রক্রিয়াগুলির মধ্যে পাস করা যেতে পারে।

সুরক্ষিত বাফার

Gralloc ব্যবহারের পতাকা GRALLOC_USAGE_PROTECTED গ্রাফিক্স বাফারকে শুধুমাত্র একটি হার্ডওয়্যার-সুরক্ষিত পথের মাধ্যমে প্রদর্শনের অনুমতি দেয়। এই ওভারলে প্লেনগুলি হল DRM সামগ্রী প্রদর্শনের একমাত্র উপায় (DRM-সুরক্ষিত বাফারগুলি SurfaceFlinger বা OpenGL ES ড্রাইভার দ্বারা অ্যাক্সেস করা যাবে না)৷

DRM-সুরক্ষিত ভিডিও শুধুমাত্র একটি ওভারলে প্লেনে উপস্থাপন করা যেতে পারে। সুরক্ষিত বিষয়বস্তু সমর্থন করে এমন ভিডিও প্লেয়ার অবশ্যই SurfaceView এর সাথে প্রয়োগ করতে হবে। অরক্ষিত হার্ডওয়্যারে চলমান সফ্টওয়্যার বাফার পড়তে বা লিখতে পারে না; হার্ডওয়্যার-সুরক্ষিত পাথগুলি অবশ্যই হার্ডওয়্যার কম্পোজার ওভারলেতে উপস্থিত হতে হবে (অর্থাৎ, হার্ডওয়্যার কম্পোজার OpenGL ES কম্পোজিশনে স্যুইচ করলে সুরক্ষিত ভিডিওগুলি প্রদর্শন থেকে অদৃশ্য হয়ে যায়)।

সুরক্ষিত বিষয়বস্তুর বিস্তারিত জানার জন্য, DRM দেখুন।