BufferQueue ve Gralloc

BufferQueue sınıfı, grafik verilerinin arabelleklerini ( üreticiler ) oluşturan bileşenleri, görüntüleme veya daha fazla işleme için verileri kabul eden bileşenlere ( tüketiciler ) bağlar. Grafik verilerinin arabelleklerini sistem içinde hareket ettiren neredeyse her şey BufferQueue'ya dayanır.

Gralloc bellek ayırıcı, arabellek tahsisleri gerçekleştirir ve satıcıya özel iki HIDL arabirimi aracılığıyla uygulanır (bakınız hardware/interfaces/graphics/allocator/ ve hardware/interfaces/graphics/mapper/ ). allocate() işlevi, bir dizi kullanım bayrağının yanı sıra beklenen bağımsız değişkenleri (genişlik, yükseklik, piksel biçimi) alır.

BufferQueue üreticileri ve tüketicileri

Tüketiciler, BufferQueue veri yapısını oluşturur ve sahiplenir ve üreticilerinden farklı süreçlerde var olabilir. Bir üretici bir arabelleğe ihtiyaç duyduğunda, arabelleklerin genişliğini, yüksekliğini, piksel biçimini ve kullanım bayraklarını belirterek dequeueBuffer() ücretsiz bir arabellek ister. Üretici daha sonra arabelleği doldurur ve queueBuffer() çağırarak arabelleği kuyruğa döndürür. Daha sonra, tüketici, arabelleği elde acquireBuffer() ile edinir ve arabellek içeriğini kullanır. Tüketici bittiğinde, releaseBuffer() çağırarak arabelleği kuyruğa döndürür. Senkronizasyon çerçevesi , arabelleklerin Android grafik ardışık düzeninde nasıl hareket ettiğini kontrol eder.

BufferQueue'nun tutabileceği maksimum tampon sayısı gibi bazı özellikleri, üretici ve tüketici tarafından ortaklaşa belirlenir. Ancak, BufferQueue, arabellekleri ihtiyaç duyduğu şekilde ayırır. Özellikler değişmediği sürece tamponlar korunur; örneğin, bir üretici farklı boyutta tamponlar talep ederse, eski tamponlar serbest bırakılır ve talep üzerine yeni tamponlar tahsis edilir.

Bu kadar çok veriyi hareket ettirmek verimsiz olduğundan, arabellek içeriği BufferQueue tarafından asla kopyalanmaz. Bunun yerine, arabellekler her zaman bir tanıtıcı tarafından geçirilir.

Systrace ile BufferQueue'yu İzleme

Grafik arabelleklerinin nasıl hareket ettiğini anlamak için, cihaz etkinliğini kısa bir süre boyunca kaydeden bir araç olan Systrace'i kullanın. Sistem düzeyindeki grafik kodu, ilgili uygulama çerçevesi kodunun çoğu gibi iyi bir şekilde donatılmıştır.

Systrace'i kullanmak için gfx , view ve sched etiketlerini etkinleştirin. BufferQueue nesneleri izlemede görüntülenir. Örnek olarak, Grafika'nın Play videosu (SurfaceView) çalışırken bir iz alırsanız, SurfaceView etiketli satır size herhangi bir zamanda kaç tane arabelleğin kuyruğa alındığını söyler.

Uygulama etkinken değer artar ve bu, MediaCodec kod çözücü tarafından çerçevelerin oluşturulmasını tetikler. SurfaceFlinger çalışırken ve arabellekleri tüketirken değer azalır. Videoyu 30 fps'de gösterirken, ~60 fps'lik ekran kaynağa ayak uydurabildiğinden kuyruğun değeri 0 ile 1 arasında değişir. SurfaceFlinger saniyede 60 kez değil, yalnızca yapılacak iş olduğunda uyanır. Sistem çalışmayı önlemeye çalışır ve ekranı güncelleyen hiçbir şey yoksa VSYNC'i devre dışı bırakır.

Grafika'nın Play videosuna (TextureView) geçerseniz ve yeni bir iz alırsanız, com.android.grafika / com.android.grafika.PlayMovieActivity etiketli bir satır görürsünüz. Bu, başka bir BufferQueue olan ana UI katmanıdır. TextureView, ayrı bir katman yerine UI katmanına işlendiğinden, video odaklı güncellemelerin tümü burada görüntülenir.

Gralloc

Gralloc ayırıcı HAL hardware/libhardware/include/hardware/gralloc.h , kullanım bayrakları aracılığıyla arabellek ayırmaları gerçekleştirir. Kullanım bayrakları aşağıdaki gibi öznitelikleri içerir:

  • Yazılımdan (CPU) belleğe ne sıklıkla erişileceği
  • Belleğe donanımdan (GPU) ne sıklıkla erişileceği
  • Belleğin OpenGL ES (GLES) dokusu olarak kullanılıp kullanılmayacağı
  • Belleğin bir video kodlayıcı tarafından kullanılıp kullanılmayacağı

Örneğin, bir üreticinin arabellek formatı RGBA_8888 pikseli belirtiyorsa ve üretici ara belleğe yazılımdan erişileceğini belirtiyorsa (yani bir uygulama CPU'daki piksellere dokunacaktır), Gralloc RGBA düzeninde piksel başına 4 baytlık bir arabellek oluşturur. Bunun yerine, bir üretici arabelleğine yalnızca donanımdan ve bir GLES dokusu olarak erişileceğini belirtirse, Gralloc, GLES sürücüsünün BGRA siparişi, doğrusal olmayan kıvrımlı düzenler ve alternatif renk biçimleri gibi istediği her şeyi yapabilir. Donanımın tercih edilen biçimi kullanmasına izin vermek performansı artırabilir.

Bazı değerler belirli platformlarda birleştirilemez. Örneğin, video kodlayıcı bayrağı YUV pikselleri gerektirebilir, bu nedenle yazılım erişimi ekleme ve RGBA_8888 belirtme başarısız olur.

Gralloc tarafından döndürülen tanıtıcı, işlemler arasında Binder aracılığıyla geçirilebilir.

Korumalı arabellekler

Gralloc kullanım bayrağı GRALLOC_USAGE_PROTECTED , grafik arabelleğinin yalnızca donanım korumalı bir yoldan görüntülenmesine izin verir. Bu bindirme düzlemleri, DRM içeriğini görüntülemenin tek yoludur (DRM korumalı arabelleklere SurfaceFlinger veya OpenGL ES sürücüsü tarafından erişilemez).

DRM korumalı video yalnızca bir bindirme düzleminde sunulabilir. Korumalı içeriği destekleyen video oynatıcılar SurfaceView ile uygulanmalıdır. Korumasız donanım üzerinde çalışan yazılımlar arabelleği okuyamaz veya yazamaz; Hardware Composer kaplamasında donanım korumalı yollar görünmelidir (yani, Hardware Composer OpenGL ES kompozisyonuna geçerse korumalı videolar ekrandan kaybolur).

Korunan içerikle ilgili ayrıntılar için bkz. DRM .