TextureView क्लास एक व्यू ऑब्जेक्ट है जो एक व्यू को SurfaceTexture के साथ जोड़ता है।
ओपनजीएल ईएस के साथ प्रतिपादन
एक TextureView ऑब्जेक्ट एक SurfaceTexture को लपेटता है, कॉलबैक का जवाब देता है और नए बफ़र्स प्राप्त करता है। जब एक TextureView नए बफ़र्स प्राप्त करता है, तो एक TextureView एक दृश्य अमान्य अनुरोध जारी करता है और नवीनतम बफ़र की सामग्री को अपने डेटा स्रोत के रूप में उपयोग करता है, जहां भी और जैसे भी दृश्य स्थिति इंगित करता है उसे प्रस्तुत करता है।
OpenGL ES (GLES) SurfaceTexture को EGL क्रिएशन कॉल में पास करके TextureView पर रेंडर कर सकता है , लेकिन इससे एक समस्या पैदा होती है। जब GLES TextureView पर रेंडर करता है, तो बफ़रक्यू निर्माता और उपभोक्ता एक ही थ्रेड में होते हैं, जिसके कारण बफ़र स्वैप कॉल रुक या विफल हो सकती है। उदाहरण के लिए, यदि कोई निर्माता यूआई थ्रेड से त्वरित उत्तराधिकार में कई बफ़र्स सबमिट करता है, तो ईजीएल बफ़र स्वैप कॉल को बफ़रक्यू से एक बफ़र को हटाने की आवश्यकता होती है। हालाँकि, क्योंकि उपभोक्ता और निर्माता एक ही धागे पर हैं, इसलिए कोई बफ़र्स उपलब्ध नहीं होंगे और स्वैप कॉल हैंग हो जाती है या विफल हो जाती है।
यह सुनिश्चित करने के लिए कि बफ़र स्वैप रुक न जाए, बफ़रक्यू को हमेशा डीक्यू करने के लिए एक बफ़र की आवश्यकता होती है। इसे लागू करने के लिए, जब कोई नया बफ़र कतारबद्ध होता है तो बफ़रक्यू पहले प्राप्त बफ़र की सामग्री को त्याग देता है और उपभोक्ता को एक ही बार में सभी बफ़र्स का उपभोग करने से रोकने के लिए न्यूनतम और अधिकतम बफ़र गणना पर प्रतिबंध लगाता है।
सरफेस व्यू या टेक्सचर व्यू चुनना
SurfaceView और TextureView समान भूमिकाएँ निभाते हैं और दोनों दृश्य पदानुक्रम के नागरिक हैं। हालाँकि, SurfaceView और TextureView के अलग-अलग कार्यान्वयन हैं। एक SurfaceView अन्य दृश्यों के समान पैरामीटर लेता है, लेकिन प्रस्तुत किए जाने पर SurfaceView सामग्री पारदर्शी होती है।
टेक्सचर व्यू में सरफेस व्यू की तुलना में बेहतर अल्फा और रोटेशन हैंडलिंग होती है, लेकिन वीडियो के ऊपर यूआई तत्वों को संयोजित करते समय सरफेस व्यू में प्रदर्शन लाभ होता है। जब कोई क्लाइंट SurfaceView के साथ रेंडर करता है, तो SurfaceView क्लाइंट को एक अलग कंपोज़िशन लेयर प्रदान करता है। यदि डिवाइस समर्थित हो तो SurfaceFlinger एक हार्डवेयर ओवरले के रूप में अलग परत बनाता है। जब कोई क्लाइंट टेक्सचर व्यू के साथ रेंडर करता है, तो यूआई टूलकिट टेक्सचर व्यू की सामग्री को जीपीयू के साथ व्यू पदानुक्रम में संयोजित करता है। सामग्री में अपडेट के कारण अन्य दृश्य तत्व फिर से तैयार हो सकते हैं, उदाहरण के लिए, यदि अन्य दृश्य टेक्सचर व्यू के शीर्ष पर स्थित हैं। व्यू रेंडरिंग पूर्ण होने के बाद, सरफेसफ्लिंगर ऐप यूआई परत और अन्य सभी परतों को मिश्रित करता है, ताकि प्रत्येक दृश्यमान पिक्सेल दो बार मिश्रित हो।
केस स्टडी: ग्राफिका का प्ले वीडियो
ग्राफ़िका के प्ले वीडियो में वीडियो प्लेयर की एक जोड़ी शामिल है, एक टेक्सचर व्यू के साथ कार्यान्वित किया गया है और एक सरफेस व्यू के साथ कार्यान्वित किया गया है। गतिविधि का वीडियो डिकोडिंग भाग MediaCodec से TextureView और SurfaceView दोनों के लिए एक सतह पर फ़्रेम भेजता है। कार्यान्वयन के बीच सबसे बड़ा अंतर सही पहलू अनुपात प्रस्तुत करने के लिए आवश्यक कदम हैं।
SurfaceView को स्केल करने के लिए फ़्रेमलेआउट के कस्टम कार्यान्वयन की आवश्यकता होती है। विंडोमैनेजर को सरफेसफ्लिंगर को एक नई विंडो स्थिति और नए आकार के मान भेजने की आवश्यकता है। TextureView के SurfaceTexture को स्केल करने के लिए TextureView#setTransform()
के साथ एक परिवर्तन मैट्रिक्स को कॉन्फ़िगर करने की आवश्यकता होती है।
सही पहलू अनुपात प्रस्तुत करने के बाद, दोनों कार्यान्वयन एक ही पैटर्न का पालन करते हैं। जब SurfaceView/TextureView सतह बनाता है, तो ऐप कोड प्लेबैक को सक्षम बनाता है। जब कोई उपयोगकर्ता प्ले टैप करता है, तो यह आउटपुट लक्ष्य के रूप में सतह के साथ एक वीडियो डिकोडिंग थ्रेड शुरू करता है। उसके बाद, ऐप कोड कुछ नहीं करता-रचना और प्रदर्शन को SurfaceFlinger (SurfaceView के लिए) या TextureView द्वारा नियंत्रित किया जाता है।
केस स्टडी: ग्राफिका का डबल डिकोड
ग्राफ़िका का डबल डिकोड टेक्सचर व्यू के अंदर सरफेस टेक्सचर के हेरफेर को प्रदर्शित करता है।
ग्राफ़िका का डबल डिकोड एक वीडियो कॉन्फ्रेंसिंग ऐप का अनुकरण करते हुए, दो वीडियो को एक साथ चलते हुए दिखाने के लिए टेक्सचर व्यू ऑब्जेक्ट की एक जोड़ी का उपयोग करता है। जब स्क्रीन का ओरिएंटेशन बदलता है और गतिविधि पुनरारंभ होती है, तो मीडियाकोड डिकोडर बंद नहीं होते हैं, वास्तविक समय वीडियो स्ट्रीम के प्लेबैक का अनुकरण करते हैं। दक्षता में सुधार के लिए, ग्राहक को सतह को जीवित रखना चाहिए। Surface, SurfaceTexture के बफ़रक्यू में निर्माता इंटरफ़ेस का एक हैंडल है। क्योंकि TextureView SurfaceTexture को प्रबंधित करता है, क्लाइंट को सतह को जीवित रखने के लिए SurfaceTexture को जीवित रखने की आवश्यकता होती है।
SurfaceTexture को जीवित रखने के लिए, Grafika का डबल डिकोड TextureView ऑब्जेक्ट से SurfaceTextures के संदर्भ प्राप्त करता है और उन्हें एक स्थिर फ़ील्ड में सहेजता है। फिर, SurfaceTexture के विनाश को रोकने के लिए Grafika का डबल डिकोड TextureView.SurfaceTextureListener#onSurfaceTextureDestroyed()
से false
रिटर्न देता है। TextureView फिर SurfaceTexture को onSurfaceTextureDestroyed()
पर भेजता है जिसे गतिविधि कॉन्फ़िगरेशन परिवर्तन के दौरान बनाए रखा जा सकता है, जिसे क्लाइंट setSurfaceTexture()
के माध्यम से नए TextureView पर भेजता है।
प्रत्येक वीडियो डिकोडर को अलग थ्रेड चलाते हैं। मीडियासर्वर सरफेसटेक्स्चर, बफ़रक्यू उपभोक्ताओं को डिकोडेड आउटपुट के साथ बफ़र्स भेजता है। TextureView ऑब्जेक्ट UI थ्रेड पर रेंडरिंग और निष्पादन करते हैं।
ग्राफ़िका के डबल डिकोड को SurfaceView के साथ लागू करना TextureView के साथ लागू करने की तुलना में कठिन है क्योंकि SurfaceView ऑब्जेक्ट ओरिएंटेशन परिवर्तन के दौरान सतहों को नष्ट कर देते हैं। इसके अतिरिक्त, SurfaceView ऑब्जेक्ट का उपयोग करने से दो परतें जुड़ जाती हैं, जो हार्डवेयर पर उपलब्ध ओवरले की संख्या की सीमाओं के कारण आदर्श नहीं है।