BufferQueue ve Gralloc

BufferQueue sınıfı, grafik veri tamponları oluşturan bileşenleri (üreticiler) verileri görüntüleme veya daha fazla işleme için kabul eden bileşenlere (tüketiciler) bağlar. Sistemde grafik veri arabelleklerini taşıyan neredeyse her şey BufferQueue'ı kullanır.

Gralloc bellek ayırıcı, arabelleği ayırır ve tedarikçiye özgü iki HIDL arayüzü aracılığıyla uygulanır (hardware/interfaces/graphics/allocator/ ve hardware/interfaces/graphics/mapper/ bölümüne bakın). allocate() işlevi, beklenen bağımsız değişkenleri (genişlik, yükseklik, piksel biçimi) ve bir dizi kullanım işaretini alır.

BufferQueue üreticileri ve tüketicileri

Tüketiciler, BufferQueue veri yapısını oluşturur ve bu yapının sahibi olur. Tüketiciler, üreticilerinden farklı işlemlerde bulunabilir. Bir üreticinin arabelleğe ihtiyacı olduğunda, arabelleğin genişliğini, yüksekliğini, piksel biçimini ve kullanım işaretlerini belirterek dequeueBuffer() işlevini çağırarak BufferQueue'dan boş bir arabelleğe istek gönderir. Ardından üretici, arabelleği doldurur ve queueBuffer() çağrısı yaparak arabelleği sıraya döndürür. Ardından tüketici, acquireBuffer() ile arabelleği alır ve arabellek içeriğini kullanır. Tüketici işi tamamladığında releaseBuffer() işlevini çağırarak arabelleği sıraya döndürür. Senkronizasyon çerçevesi, arabellekleri Android grafik ardışık düzeninde nasıl taşındığını kontrol eder.

BufferQueue'ın bazı özellikleri (ör. barındırabileceği maksimum arabellek sayısı) üretici ve tüketici tarafından birlikte belirlenir. Ancak BufferQueue, ihtiyaç duyduğu tamponları ayırır. Özellikleri değişmediği sürece arabellekler tutulur. Örneğin, bir üretici farklı boyutlarda arabellekler isterse eski arabellekler serbest bırakılır ve yeni arabellekler talep üzerine ayrılır.

Bu kadar veri taşımak verimsiz olduğu için arabellek içerikleri BufferQueue tarafından hiçbir zaman kopyalanmaz. Bunun yerine, tamponlar her zaman bir tutamak tarafından iletilir.

Systrace ile BufferQueue'ı izleme

Grafik arabelleklerinin nasıl hareket ettiğini anlamak için kısa bir süre boyunca cihaz etkinliğini kaydeden Systrace aracını kullanın. Sistem düzeyindeki grafik kodu ve ilgili uygulama çerçevesi kodunun büyük bir kısmı iyi bir şekilde enstrümante edilmiştir.

Systrace'i kullanmak için gfx, view ve sched etiketlerini etkinleştirin. BufferQueue nesneleri izlemede gösterilir. Örneğin, Grafika'nın Play videosu (SurfaceView) çalışırken izleme yaparsanız SurfaceView etiketli satırda, belirli bir zamanda ne kadar arabelleğin sıraya eklendiğini görebilirsiniz.

Uygulama etkinken değer artar ve bu da MediaCodec kod çözücü tarafından karelerin oluşturulmasını tetikler. SurfaceFlinger çalışırken ve arabellekleri tüketirken değer azalır. Video 30 fps'de gösterilirken yaklaşık 60 fps'lik ekran kaynağa ayak uydurabileceğinden, kuyruğun değeri 0 ile 1 arasında değişir. SurfaceFlinger, saniyede 60 kez değil, yalnızca yapılması gereken bir iş olduğunda uyanır. Sistem, ekranda hiçbir şey güncellenmiyorsa çalışmayı atlamaya çalışır ve VSYNC'yi devre dışı bırakır.

Grafika'nın video oynatma (TextureView) seçeneğine geçip yeni bir izleme 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 kullanıcı arayüzü katmanıdır. TextureView, ayrı bir katman yerine kullanıcı arayüzü katmanında oluşturulduğundan videodan gelen tüm güncellemeler burada gösterilir.

Gralloc

Gralloc ayırıcı HAL,hardware/libhardware/include/hardware/gralloc.h kullanım işaretleri aracılığıyla arabellek ayırma işlemlerini gerçekleştirir. Kullanım işaretleri aşağıdakiler gibi özellikleri içerir:

  • Belleğe yazılımdan (CPU) ne sıklıkta erişileceği
  • Donanımdan (GPU) belleğe ne sıklıkta 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 biçimi RGBA_8888 piksel belirtiyorsa ve üretici, arabelleğe yazılımdan erişileceğini belirtiyorsa (yani bir uygulama CPU'daki piksellere dokunacaksa) Gralloc, R-G-B-A sırasına göre piksel başına 4 bayt içeren bir arabellek oluşturur. Bunun yerine, bir üretici arabelleğine yalnızca donanımdan ve GLES dokusu olarak erişileceğini belirtirse Gralloc, GLES sürücüsünün istediği her şeyi (ör. BGRA sıralaması, doğrusal olmayan karıştırılmış düzenler ve alternatif renk biçimleri) 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ı işareti YUV pikselleri gerektirebilir. Bu nedenle, yazılım erişimi eklemek ve RGBA_8888 belirtmek başarısız olur.

Gralloc tarafından döndürülen herkese açık kullanıcı adı, Binder aracılığıyla işlemler arasında aktarılabilir.

Korunan tamponlar

Gralloc kullanım işareti GRALLOC_USAGE_PROTECTED, grafik arabelleğinin yalnızca donanım korumalı bir yol üzerinden 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ı arabelleğe SurfaceFlinger veya OpenGL ES sürücüsü tarafından erişilemez).

DRM korumalı videolar yalnızca yer paylaşımı düzleminde sunulabilir. Korunan içeriği destekleyen video oynatıcılar SurfaceView ile uygulanmalıdır. Korunmayan donanımda çalışan yazılımlar arabelleği okuyamaz veya yazamaz. Donanım korumalı yollar, Donanım Oluşturucu yer paylaşımında görünmelidir (yani Donanım Oluşturucu OpenGL ES kompozisyonuna geçerse korunan videolar ekrandan kaybolur).

Korunan içerik hakkında ayrıntılı bilgi için DRM başlıklı makaleyi inceleyin.