BufferQueue ve Gralloc

BufferQueue sınıfı, grafiksel veri arabellekleri üreten bileşenleri ( üreticiler ), görüntüleme veya daha ileri işlemler için verileri kabul eden bileşenlere ( tüketiciler ) bağlar. Grafiksel veri arabelleklerini sistem boyunca hareket ettiren neredeyse her şey BufferQueue'ya dayanır.

Gralloc bellek ayırıcısı, arabellek tahsislerini gerçekleştirir ve satıcıya özel iki HIDL arabirimi aracılığıyla uygulanır (bkz hardware/interfaces/graphics/allocator/ ve hardware/interfaces/graphics/mapper/ ). allocate() işlevi, bir dizi kullanım bayrağının yanı sıra beklenen argümanları (genişlik, yükseklik, piksel formatı) alır.

BufferQueue üreticileri ve tüketicileri

Tüketiciler BufferQueue veri yapısını oluşturup sahiplenirler ve üreticilerinden farklı süreçlerde var olabilirler. 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() çağırarak BufferQueue'den ücretsiz bir arabellek ister. Üretici daha sonra arabelleği doldurur ve queueBuffer() öğesini çağırarak arabelleği kuyruğa geri döndürür. Daha sonra tüketici, acquireBuffer() ile arabelleği alır ve arabellek içeriğini kullanır. Tüketicinin işi bittiğinde, releaseBuffer() öğesini çağırarak arabelleği kuyruğa döndürür. Senkronizasyon çerçevesi, arabelleklerin Android grafik hattında 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 arabellekler 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 fazla verinin taşınması verimsiz olduğundan arabellek içerikleri hiçbir zaman BufferQueue tarafından kopyalanmaz. Bunun yerine arabellekler her zaman bir tanıtıcıdan geçirilir.

BufferQueue'yu Systrace ile Takip Edin

Grafik arabelleklerinin nasıl hareket ettiğini anlamak için cihaz etkinliğini kısa bir süre boyunca kaydeden Systrace aracını kullanın. İlgili uygulama çerçeve kodunun çoğunda olduğu gibi, sistem düzeyindeki grafik kodu da 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 izleme alırsanız, SurfaceView etiketli satır size herhangi bir zamanda kaç arabelleğin sıraya konulduğunu söyler.

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

Grafika'nın Play video'suna (TextureView) geçip yeni bir iz yakalarsanız com.android.grafika / com.android.grafika.PlayMovieActivity etiketli bir satır görürsünüz. Bu, başka bir BufferQueue olan ana kullanıcı arayüzü katmanıdır. TextureView ayrı bir katman yerine kullanıcı arayüzü katmanında görüntülendiğinden, video odaklı güncellemelerin tümü burada görüntülenir.

Gralloc

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

  • Belleğe yazılımdan (CPU) 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 pikselini belirtiyorsa ve üretici ara belleğe yazılımdan erişileceğini belirtiyorsa (yani bir uygulamanın CPU üzerindeki piksellere dokunacağı anlamına gelir), Gralloc, RGBA sırasına göre 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, BGRA sıralaması, doğrusal olmayan kaydırılmış düzenler ve alternatif renk formatları gibi GLES sürücüsünün istediği her şeyi yapabilir. Donanımın tercih ettiği biçimi kullanmasına izin vermek performansı artırabilir.

Bazı değerler belirli platformlarda birleştirilemez. Örneğin, video kodlayıcı bayrağı YUV piksellerini gerektirebilir, dolayısıyla yazılım erişimi eklemek ve RGBA_8888 belirtmek başarısız olur.

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

Korumalı arabellekler

Gralloc kullanım bayrağı GRALLOC_USAGE_PROTECTED grafik arabelleğinin yalnızca donanım korumalı bir yol aracılığıyla görüntülenmesine olanak tanır. Bu yer paylaşımı 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 yer paylaşımı düzleminde sunulabilir. Korumalı içeriği destekleyen video oynatıcıların SurfaceView ile uygulanması gerekir. Korumasız donanım üzerinde çalışan yazılım, 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).

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