টেক্সচারভিউ ক্লাস হল একটি ভিউ অবজেক্ট যা একটি ভিউকে একটি সারফেসটেক্সচারের সাথে একত্রিত করে।
OpenGL ES দিয়ে রেন্ডারিং
একটি TextureView অবজেক্ট একটি SurfaceTexture র্যাপ করে, কলব্যাকের প্রতিক্রিয়া জানায় এবং নতুন বাফার অর্জন করে। যখন একটি TextureView নতুন বাফার অর্জন করে, তখন একটি TextureView একটি ভিউ ইনভ্যালিডেট রিকোয়েস্ট ইস্যু করে এবং নতুন বাফারের কন্টেন্টকে তার ডেটা সোর্স হিসেবে ব্যবহার করে ড্র করে, যেখানেই এবং যেভাবেই ভিউ স্টেট নির্দেশ করে সেখানেই রেন্ডার করে।
OpenGL ES (GLES) SurfaceTexture কে EGL creation কলে পাস করে TextureView-এ রেন্ডার করতে পারে , কিন্তু এটি একটি সমস্যা তৈরি করে। যখন GLES একটি TextureView-এ রেন্ডার করে, তখন BufferQueue প্রযোজক এবং গ্রাহক একই থ্রেডে থাকে, যার ফলে বাফার সোয়াপ কলটি স্থগিত বা ব্যর্থ হতে পারে। উদাহরণস্বরূপ, যদি কোনও প্রযোজক UI থ্রেড থেকে দ্রুত ধারাবাহিকভাবে বেশ কয়েকটি বাফার জমা দেয়, তাহলে EGL বাফার সোয়াপ কলটিকে BufferQueue থেকে একটি বাফার ডিকিউ করতে হবে। তবে, যেহেতু গ্রাহক এবং প্রযোজক একই থ্রেডে আছেন, তাই কোনও বাফার উপলব্ধ থাকবে না এবং সোয়াপ কলটি হ্যাং বা ব্যর্থ হবে।
বাফার সোয়াপ স্টল প্রতিরোধ করার জন্য, BufferQueue-এর সর্বদা ডিকিউইংয়ের জন্য একটি বাফার উপলব্ধ থাকা প্রয়োজন। এটি করার জন্য, যখন একটি নতুন বাফার সারিবদ্ধ করা হয় তখন BufferQueue পূর্বে অর্জিত বাফারের বিষয়বস্তু বাতিল করে দেয়। এটি ন্যূনতম এবং সর্বোচ্চ বাফার গণনার উপরও বিধিনিষেধ আরোপ করে যাতে কোনও গ্রাহক একবারে সমস্ত বাফার ব্যবহার করতে না পারে।
সারফেসভিউ অথবা টেক্সচারভিউ নির্বাচন করা
SurfaceView এবং TextureView একই ভূমিকা পালন করে এবং উভয়ই ভিউ হায়ারার্কির নাগরিক। তবে, SurfaceView এবং TextureView এর বাস্তবায়ন ভিন্ন। একটি SurfaceView অন্যান্য ভিউয়ের মতো একই পরামিতি গ্রহণ করে, কিন্তু রেন্ডার করার সময় SurfaceView এর বিষয়বস্তু স্বচ্ছ থাকে।
একটি TextureView-এর আলফা এবং ঘূর্ণন হ্যান্ডলিং SurfaceView-এর তুলনায় ভালো, তবে ভিডিওর উপর স্তরযুক্ত UI উপাদানগুলি কম্পোজ করার সময় SurfaceView-এর কর্মক্ষমতা সুবিধা রয়েছে। যখন একটি ক্লায়েন্ট SurfaceView-এর সাথে রেন্ডার করে, তখন SurfaceView ক্লায়েন্টকে একটি পৃথক কম্পোজিশন স্তর প্রদান করে। ডিভাইস দ্বারা সমর্থিত হলে SurfaceFlinger পৃথক স্তরটিকে একটি হার্ডওয়্যার ওভারলে হিসাবে রচনা করে। যখন একটি ক্লায়েন্ট TextureView-এর সাথে রেন্ডার করে, তখন UI টুলকিট TextureView-এর বিষয়বস্তুকে GPU-এর সাথে ভিউ হায়ারার্কিতে সংমিশ্রণ করে। বিষয়বস্তুর আপডেটের ফলে অন্যান্য ভিউ উপাদানগুলি পুনরায় অঙ্কিত হতে পারে, উদাহরণস্বরূপ, যদি অন্যান্য ভিউগুলি TextureView-এর উপরে অবস্থিত হয়। ভিউ রেন্ডারিং সম্পূর্ণ হওয়ার পরে, SurfaceFlinger অ্যাপ UI স্তর এবং অন্যান্য সমস্ত স্তরগুলিকে সংমিশ্রণ করে, যাতে প্রতিটি দৃশ্যমান পিক্সেল দুবার সংমিশ্রিত হয়।
কেস স্টাডি: গ্রাফিকার প্লে ভিডিও
গ্রাফিকার প্লে ভিডিওতে একজোড়া ভিডিও প্লেয়ার রয়েছে, একটি টেক্সচারভিউ দিয়ে বাস্তবায়িত এবং অন্যটি সারফেসভিউ দিয়ে বাস্তবায়িত। কার্যকলাপের ভিডিও ডিকোডিং অংশটি মিডিয়াকোডেক থেকে টেক্সচারভিউ এবং সারফেসভিউ উভয়ের জন্য একটি পৃষ্ঠে ফ্রেম পাঠায়। বাস্তবায়নের মধ্যে সবচেয়ে বড় পার্থক্য হল সঠিক আকৃতির অনুপাত উপস্থাপনের জন্য প্রয়োজনীয় পদক্ষেপগুলি।
SurfaceView স্কেলিং করার জন্য FrameLayout এর একটি কাস্টম বাস্তবায়ন প্রয়োজন। WindowManager কে SurfaceFlinger এ একটি নতুন উইন্ডো অবস্থান এবং নতুন আকারের মান পাঠাতে হবে। TextureView এর SurfaceTexture স্কেলিং করার জন্য TextureView#setTransform()
দিয়ে একটি রূপান্তর ম্যাট্রিক্স কনফিগার করতে হবে।
সঠিক আকৃতির অনুপাত উপস্থাপনের পর, উভয় বাস্তবায়ন একই প্যাটার্ন অনুসরণ করে। যখন SurfaceView/TextureView সারফেস তৈরি করে, তখন অ্যাপ কোড প্লেব্যাক সক্ষম করে। যখন একজন ব্যবহারকারী play এ ট্যাপ করে, তখন এটি একটি ভিডিও ডিকোডিং থ্রেড শুরু করে, যার আউটপুট টার্গেট হল surface। এর পরে, অ্যাপ কোড কিছুই করে না—রচনা এবং প্রদর্শন SurfaceFlinger (SurfaceView এর জন্য) অথবা TextureView দ্বারা পরিচালিত হয়।
কেস স্টাডি: গ্রাফিকার ডাবল ডিকোড
গ্রাফিকার ডাবল ডিকোড একটি টেক্সচারভিউয়ের ভিতরে সারফেসটেক্সচারের ম্যানিপুলেশন প্রদর্শন করে।
গ্রাফিকার ডাবল ডিকোড দুটি ভিডিও পাশাপাশি চালানোর জন্য টেক্সচারভিউ অবজেক্ট ব্যবহার করে, যা একটি ভিডিও কনফারেন্সিং অ্যাপের অনুকরণ করে। যখন স্ক্রিনের ওরিয়েন্টেশন পরিবর্তন হয় এবং কার্যকলাপ পুনরায় চালু হয়, তখন মিডিয়াকোডেক ডিকোডারগুলি থামে না, একটি রিয়েল-টাইম ভিডিও স্ট্রিমের প্লেব্যাক অনুকরণ করে। দক্ষতা উন্নত করার জন্য, ক্লায়েন্টের পৃষ্ঠকে জীবন্ত রাখা উচিত। পৃষ্ঠটি SurfaceTexture এর BufferQueue-তে প্রযোজক ইন্টারফেসের একটি হ্যান্ডেল। যেহেতু TextureView SurfaceTexture পরিচালনা করে, ক্লায়েন্টকে পৃষ্ঠকে জীবন্ত রাখার জন্য SurfaceTexture জীবন্ত রাখতে হবে।
SurfaceTexture-কে জীবন্ত রাখার জন্য, Grafika-এর Double Decode TextureView অবজেক্ট থেকে SurfaceTextures-এর রেফারেন্স সংগ্রহ করে এবং একটি স্ট্যাটিক ফিল্ডে সংরক্ষণ করে। তারপর, Grafika-এর Double Decode SurfaceTexture-এর ধ্বংস রোধ করার জন্য TextureView.SurfaceTextureListener#onSurfaceTextureDestroyed()
থেকে false
ফেরত পাঠায়। TextureView তারপর onSurfaceTextureDestroyed()
-এ একটি SurfaceTexture পাঠায় যা কার্যকলাপ কনফিগারেশন পরিবর্তনের সময় বজায় রাখা যেতে পারে, যা ক্লায়েন্ট setSurfaceTexture()
এর মাধ্যমে নতুন TextureView-এ পাঠায়।
প্রতিটি ভিডিও ডিকোডারকে আলাদা আলাদা থ্রেড চালিত করে। মিডিয়াসার্ভার ডিকোডেড আউটপুট সহ বাফারগুলি SurfaceTextures, BufferQueue গ্রাহকদের কাছে পাঠায়। TextureView অবজেক্টগুলি রেন্ডারিং সম্পাদন করে এবং UI থ্রেডে এক্সিকিউট করে।
সারফেসভিউ দিয়ে গ্রাফিকার ডাবল ডিকোড বাস্তবায়ন করা টেক্সচারভিউ দিয়ে বাস্তবায়নের চেয়ে কঠিন কারণ সারফেসভিউ অবজেক্টগুলি ওরিয়েন্টেশন পরিবর্তনের সময় পৃষ্ঠতল ধ্বংস করে। অতিরিক্তভাবে, সারফেসভিউ অবজেক্ট ব্যবহার করলে দুটি স্তর যুক্ত হয়, যা হার্ডওয়্যারে উপলব্ধ ওভারলে সংখ্যার সীমাবদ্ধতার কারণে আদর্শ নয়।