টেক্সচারভিউ

টেক্সচারভিউ ক্লাস একটি ভিউ অবজেক্ট যা একটি সারফেসটেক্সচারের সাথে একটি ভিউকে একত্রিত করে।

OpenGL ES এর সাথে রেন্ডারিং

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

OpenGL ES (GLES) EGL তৈরি কলে SurfaceTexture পাস করে TextureView-এ রেন্ডার করতে পারে , কিন্তু এটি একটি সমস্যা তৈরি করে। যখন GLES একটি TextureView-এ রেন্ডার করে, তখন BufferQueue প্রযোজক এবং ভোক্তারা একই থ্রেডে থাকে, যা বাফার সোয়াপ কল স্টল বা ব্যর্থ হতে পারে। উদাহরণস্বরূপ, যদি একজন প্রযোজক UI থ্রেড থেকে দ্রুত পর্যায়ক্রমে বেশ কয়েকটি বাফার জমা দেন, তাহলে EGL বাফার সোয়াপ কলের জন্য BufferQueue থেকে একটি বাফার ডিকিউ করতে হবে। যাইহোক, যেহেতু ভোক্তা এবং প্রযোজক একই থ্রেডে রয়েছে, সেখানে কোনো বাফার উপলব্ধ থাকবে না এবং অদলবদল কল হ্যাং বা ব্যর্থ হয়।

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

সারফেসভিউ বা টেক্সচারভিউ বেছে নেওয়া

সারফেসভিউ এবং টেক্সচারভিউ একই ধরনের ভূমিকা পূরণ করে এবং উভয়ই ভিউ হায়ারার্কির নাগরিক। যাইহোক, সারফেসভিউ এবং টেক্সচারভিউ বিভিন্ন বাস্তবায়ন আছে। একটি সারফেসভিউ অন্যান্য ভিউগুলির মতো একই প্যারামিটার নেয়, তবে রেন্ডার করার সময় সারফেসভিউ বিষয়বস্তু স্বচ্ছ হয়।

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

কেস স্টাডি: গ্রাফিকার প্লে ভিডিও

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

Scaling SurfaceView এর জন্য FrameLayout-এর একটি কাস্টম বাস্তবায়ন প্রয়োজন। WindowManagerকে SurfaceFlinger-এ একটি নতুন উইন্ডো অবস্থান এবং নতুন আকারের মান পাঠাতে হবে। একটি টেক্সচারভিউ-এর সারফেসটেক্সচার স্কেল করার জন্য TextureView#setTransform() এর সাথে একটি রূপান্তর ম্যাট্রিক্স কনফিগার করা প্রয়োজন।

সঠিক অনুপাত উপস্থাপন করার পরে, উভয় বাস্তবায়ন একই প্যাটার্ন অনুসরণ করে। যখন সারফেসভিউ/টেক্সচারভিউ পৃষ্ঠ তৈরি করে, অ্যাপ কোড প্লেব্যাক সক্ষম করে। যখন একজন ব্যবহারকারী প্লে ট্যাপ করে, তখন এটি একটি ভিডিও ডিকোডিং থ্রেড শুরু করে, আউটপুট লক্ষ্য হিসাবে পৃষ্ঠটি সহ। এর পরে, অ্যাপ কোড কিছুই করে না—কম্পোজিশন এবং ডিসপ্লে SurfaceFlinger (SurfaceView-এর জন্য) বা TextureView দ্বারা পরিচালিত হয়।

কেস স্টাডি: গ্রাফিকার ডাবল ডিকোড

গ্রাফিকার ডাবল ডিকোড টেক্সচারভিউ -এর ভিতরে সারফেস টেক্সচারের ম্যানিপুলেশন প্রদর্শন করে।

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

সারফেস টেক্সচারকে জীবিত রাখার জন্য, গ্রাফিকার ডাবল ডিকোড টেক্সচারভিউ অবজেক্ট থেকে সারফেস টেক্সচারের রেফারেন্স প্রাপ্ত করে এবং একটি স্ট্যাটিক ফিল্ডে সেভ করে। তারপর, সারফেসটেক্সচারের ধ্বংস রোধ করতে গ্রাফিকের ডাবল ডিকোড TextureView.SurfaceTextureListener#onSurfaceTextureDestroyed() থেকে false ফেরত দেয়। TextureView তারপর একটি SurfaceTexture onSurfaceTextureDestroyed() এ পাস করে যা অ্যাক্টিভিটি কনফিগারেশন পরিবর্তন জুড়ে রক্ষণাবেক্ষণ করা যায়, যা ক্লায়েন্ট setSurfaceTexture() এর মাধ্যমে নতুন TextureView-এ পাস করে।

পৃথক থ্রেড প্রতিটি ভিডিও ডিকোডার চালায়। মিডিয়াসার্ভার ডিকোডেড আউটপুট সহ বাফার পাঠায় SurfaceTextures, BufferQueue গ্রাহকদের কাছে। TextureView অবজেক্টগুলি UI থ্রেডে রেন্ডারিং এবং এক্সিকিউট করে।

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