Google 致力于为黑人社区推动种族平等。查看具体举措
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

BufferQueue ve Gralloc

BufferQueue sınıfı, grafiksel verilerin ( üreticiler ) tamponlarını oluşturan bileşenleri, verileri görüntüleme veya daha fazla işleme ( tüketiciler ) için kabul eden bileşenlere bağlar. Grafik veri tamponlarını sistem üzerinden taşıyan hemen hemen her şey BufferQueue'ya dayanır.

Gralloc bellek ayırıcısı, arabellek ayırmaları gerçekleştirir ve satıcıya özgü iki HIDL arabirimi aracılığıyla uygulanır (bkz. hardware/interfaces/graphics/allocator/ ve hardware/interfaces/graphics/mapper/ ). 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 sahiplenir ve üreticilerinden farklı süreçlerde var olabilir. Bir üretici bir arabelleğe ihtiyaç duyduğunda, dequeueBuffer() çağırarak, arabelleklerin genişliğini, yüksekliğini, piksel biçimini ve kullanım bayraklarını belirterek dequeueBuffer() ücretsiz bir arabellek ister. Üretici daha sonra tamponu doldurur ve queueBuffer() çağırarak tamponu kuyruğa döndürür. Daha sonra tüketici, acquireBuffer() ile tamponu elde eder ve tampon içeriklerini kullanır. Tüketici bittiğinde, releaseBuffer() çağırarak arabelleği kuyruğa geri 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ç duydukça ayırır. Özellikler değişmedikçe 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.

Buffer içeriği, bufferQueue tarafından asla kopyalanmaz, çünkü bu kadar çok veriyi hareket ettirmek verimsizdir. Bunun yerine, tamponlar her zaman bir tanıtıcı tarafından geçirilir.

Systrace ile BufferQueue İzleme

Grafik arabelleklerinin nasıl hareket ettiğini anlamak için, kısa bir süre boyunca aygıt etkinliğini kaydeden bir araç olan Systrace'i kullanın. Sistem düzeyinde grafik kodu, ilgili uygulama çerçeve kodunun çoğu gibi iyi bir şekilde tasarlanmış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 Oynat videosu (SurfaceView) çalışırken bir izleme yaparsanız , SurfaceView etiketli satır size herhangi bir zamanda kaç arabelleğin sıraya alındığını söyler.

Değer, uygulama etkinken artar ve bu, MediaCodec kod çözücü tarafından çerçevelerin oluşturulmasını tetikler. SurfaceFlinger çalışırken ve tamponları tüketirken değer azalır. Videoyu 30 fps'de gösterirken, sıranın değeri 0 ile 1 arasında değişir çünkü ~ 60 fps ekran kaynağa ayak uydurabilir. SurfaceFlinger, saniyede 60 kez değil, yalnızca yapılacak iş olduğunda uyanır. Ekranı hiçbir şey güncellemiyorsa sistem çalışmaktan kaçınmaya çalışır ve VSYNC'yi devre dışı bırakır.

Grafika'nın Oynatma videosuna (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 UI katmanıdır. TextureView ayrı bir katmandan ziyade UI katmanına işlediğinden, tüm video tabanlı güncellemeler 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ını gerçekleştirir. Kullanım bayrakları aşağıdakiler gibi öznitelikleri içerir:

  • Belleğe yazılımdan (CPU) ne sıklıkla erişilecek
  • Belleğe donanımdan (GPU) ne sıklıkla erişilecek
  • 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 belirtirse ve üretici arabelleğe yazılımdan erişileceğini belirtirse (yani bir uygulama CPU'daki piksellere dokunur), Gralloc RGBA düzeninde piksel başına 4 baytlık bir arabellek oluşturur. Bunun yerine, bir üretici arabelleğine yalnızca donanımdan erişileceğini ve bir GLES dokusu olarak belirlediğinde, Gralloc, BGRA sıralaması, doğrusal olmayan kıvrımlı düzenler ve alternatif renk biçimleri gibi GLES sürücüsünün 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ı işareti YUV pikselleri gerektirebilir, bu nedenle yazılım erişiminin eklenmesi ve RGBA_8888 belirtilmesi başarısız olur.

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

Korumalı tamponlar

Gralloc kullanım bayrağı GRALLOC_USAGE_PROTECTED , grafik arabelleğinin yalnızca donanım korumalı bir yol üzerinden görüntülenmesine izin verir. Bu kaplama 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 kaplama 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ım, arabelleği okuyamaz veya yazamaz; Hardware Composer kaplamasında donanım korumalı yollar görünmelidir (yani, Hardware Composer OpenGL ES bileşimine geçerse korumalı videolar ekrandan kaybolur).

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