Doku Görünümü

TextureView sınıfı, bir görünümü SurfaceTexture ile birleştiren bir görünüm nesnesidir.

OpenGL ES ile oluşturma

TextureView nesnesi bir SurfaceTexture'ı sararak geri aramalara yanıt verir ve yeni arabellekler alır. TextureView yeni arabellekler aldığında, TextureView bir görünümü geçersiz kılma isteği yayınlar ve en yeni arabelleğin içeriğini veri kaynağı olarak kullanarak çizim yapar ve görünüm durumu nerede ve nasıl olması gerektiğini gösterirse onu oluşturur.

OpenGL ES (GLES), SurfaceTexture'ı EGL oluşturma çağrısına ileterek TextureView üzerinde görüntü oluşturabilir , ancak bu bir sorun yaratır. GLES bir TextureView üzerinde görüntülendiğinde BufferQueue üreticileri ve tüketicileri aynı iş parçacığında bulunur ve bu da arabellek takas çağrısının durmasına veya başarısız olmasına neden olabilir. Örneğin, bir üretici UI iş parçacığından hızlı bir şekilde art arda birkaç arabellek gönderirse, EGL arabellek takas çağrısının BufferQueue'dan bir arabelleği sıradan çıkarması gerekir. Ancak tüketici ve üretici aynı iş parçacığında olduğundan, kullanılabilir herhangi bir arabellek olmaz ve takas çağrısı askıda kalır veya başarısız olur.

Arabellek takasının durmamasını sağlamak için BufferQueue'nun her zaman kuyruktan çıkarılabilecek bir ara belleğe ihtiyacı vardır. Bunu uygulamak için BufferQueue, yeni bir arabellek kuyruğa alındığında önceden edinilen arabelleğin içeriğini atar ve bir tüketicinin tüm arabellekleri aynı anda tüketmesini önlemek için minimum ve maksimum arabellek sayılarına kısıtlamalar getirir.

SurfaceView veya TextureView'ı seçme

SurfaceView ve TextureView benzer rolleri doldurur ve her ikisi de görünüm hiyerarşisinin vatandaşlarıdır. Ancak SurfaceView ve TextureView'ın farklı uygulamaları vardır. Bir SurfaceView diğer görünümlerle aynı parametreleri alır ancak SurfaceView içerikleri oluşturulduğunda şeffaftır.

TextureView, SurfaceView'a göre daha iyi alfa ve döndürme işleme özelliğine sahiptir, ancak SurfaceView, videolar üzerinde katmanlı kullanıcı arayüzü öğelerini birleştirirken performans avantajlarına sahiptir. Bir istemci SurfaceView ile görüntü oluşturduğunda SurfaceView, istemciye ayrı bir kompozisyon katmanı sağlar. SurfaceFlinger, aygıt tarafından destekleniyorsa ayrı katmanı donanım kaplaması olarak oluşturur. Bir istemci TextureView ile görüntü oluşturduğunda, kullanıcı arayüzü araç seti TextureView içeriğini GPU ile görünüm hiyerarşisinde birleştirir. İçerikte yapılan güncellemeler, diğer görünüm öğelerinin yeniden çizilmesine neden olabilir (örneğin, diğer görünümler TextureView'ın üstüne konumlandırılmışsa). Görünüm oluşturma tamamlandıktan sonra SurfaceFlinger, uygulama kullanıcı arayüzü katmanını ve diğer tüm katmanları birleştirir, böylece her görünür piksel iki kez birleştirilir.

Örnek Olay: Grafika'nın Oynatma Videosu

Grafika'nın Video Oynat özelliği , biri TextureView ve diğeri SurfaceView ile uygulanan bir çift video oynatıcı içerir. Etkinliğin video kod çözme kısmı, MediaCodec'ten hem TextureView hem de SurfaceView için bir yüzeye kareler gönderir. Uygulamalar arasındaki en büyük fark, doğru en boy oranını sunmak için gereken adımlardır.

SurfaceView'ın ölçeklendirilmesi, FrameLayout'un özel bir uygulamasını gerektirir. WindowManager'ın SurfaceFlinger'a yeni bir pencere konumu ve yeni boyut değerleri göndermesi gerekiyor. TextureView'ın SurfaceTexture öğesinin ölçeklendirilmesi, TextureView#setTransform() ile bir dönüşüm matrisinin yapılandırılmasını gerektirir.

Doğru en boy oranı sunulduktan sonra her iki uygulama da aynı modeli izler. SurfaceView/TextureView yüzeyi oluşturduğunda uygulama kodu oynatmayı etkinleştirir. Kullanıcı oynat'a dokunduğunda, yüzeyin çıkış hedefi olduğu bir video kod çözme iş parçacığı başlatılır. Bundan sonra uygulama kodu hiçbir şey yapmaz; kompozisyon ve görüntüleme SurfaceFlinger (SurfaceView için) veya TextureView tarafından gerçekleştirilir.

Örnek Olay İncelemesi: Grafika'nın Çift Kod Çözme Yöntemi

Grafika'nın Çift Kod Çözme özelliği, TextureView içindeki SurfaceTexture'ın manipülasyonunu gösterir.

Grafika'nın Double Decode'u, bir video konferans uygulamasını simüle ederek yan yana oynatılan iki videoyu göstermek için bir çift TextureView nesnesi kullanıyor. Ekranın yönü değiştiğinde ve etkinlik yeniden başladığında, MediaCodec kod çözücüleri durmayarak gerçek zamanlı bir video akışının oynatılmasını simüle eder. Verimliliği artırmak için müşteri yüzeyi canlı tutmalıdır. Yüzey, SurfaceTexture'ın BufferQueue'sundaki üretici arayüzüne yönelik bir tanıtıcıdır. TextureView, SurfaceTexture'ı yönettiğinden, müşterinin yüzeyi canlı tutmak için SurfaceTexture'ı canlı tutması gerekir.

SurfaceTexture'ı canlı tutmak için Grafika'nın Double Decode özelliği, TextureView nesnelerinden SurfaceTextures'a referanslar alır ve bunları statik bir alana kaydeder. Daha sonra Grafika'nın Double Decode özelliği, SurfaceTexture'ın yok edilmesini önlemek için TextureView.SurfaceTextureListener#onSurfaceTextureDestroyed() öğesinden false değerini döndürür. TextureView daha sonra, istemcinin setSurfaceTexture() onSurfaceTextureDestroyed() () öğesine bir SurfaceTexture iletir.

Ayrı iş parçacıkları her video kod çözücüyü çalıştırır. Mediaserver, kodu çözülmüş çıktıya sahip arabellekleri BufferQueue tüketicileri olan SurfaceTextures'a gönderir. TextureView nesneleri, kullanıcı arayüzü iş parçacığında oluşturma ve yürütme gerçekleştirir.

Grafika'nın Double Decode özelliğini SurfaceView ile uygulamak TextureView ile uygulamaktan daha zordur çünkü SurfaceView nesneleri oryantasyon değişiklikleri sırasında yüzeyleri tahrip eder. Ek olarak, SurfaceView nesnelerinin kullanılması iki katman ekler; bu, donanımda bulunan kaplamaların sayısındaki sınırlamalar nedeniyle ideal değildir.