Grafik mimarisi

Her geliştiricinin yüzeyler, SurfaceHolder, EGLSurface, SurfaceView, GLSurfaceView, SurfaceTexture, TextureView, SurfaceFlinger ve Vulkan hakkında bilmesi gerekenler.

Bu sayfada Android sistem düzeyindeki grafik mimarisinin temel öğeleri ve bunların uygulama çerçevesi ve multimedya sistemi tarafından nasıl kullanıldığı açıklanmaktadır. Odak noktası, grafiksel veri arabelleklerinin sistem içerisinde nasıl hareket ettiğidir. SurfaceView ve TextureView'in neden bu şekilde davrandığını veya yüzeyler ile EGLSurface'in nasıl etkileşime girdiğini merak ettiyseniz doğru yerdesiniz.

Android cihazlara ve uygulama geliştirmeye biraz aşina olunduğu varsayılmaktadır. Uygulama çerçevesi hakkında ayrıntılı bilgiye ihtiyacınız yoktur ve çok az sayıda API çağrısından bahsedilmektedir, ancak materyal diğer genel belgelerle örtüşmemektedir. Amaç, bir uygulama tasarlarken bilinçli seçimler yapmanıza yardımcı olmak amacıyla çıktı için bir çerçeve oluşturma sürecindeki önemli olaylar hakkında ayrıntılar sağlamaktır. Bunu başarmak için, aşağıdan yukarıya doğru çalışarak UI sınıflarının nasıl kullanılabileceğini değil, nasıl çalıştığını açıklıyoruz.

Bu bölüm, arka plan materyalinden HAL ayrıntılarına ve kullanım senaryolarına kadar her şeyi kapsayan birkaç sayfa içerir. Android grafik arabelleklerinin bir açıklamasıyla başlar, kompozisyonu ve görüntüleme mekanizmasını açıklar, ardından birleştiriciye veri sağlayan daha üst düzey mekanizmalara geçer. İlginç görünen bir konuya atlamak yerine sayfaları aşağıda listelenen sırayla okumanızı öneririz.

Düşük seviyeli bileşenler

  • BufferQueue ve gralloc . BufferQueue, grafiksel veri arabellekleri üreten bir şeyi ( üretici ), verileri görüntüleme veya daha fazla işlem için kabul eden bir şeye ( tüketici ) bağlar. Arabellek tahsisleri, satıcıya özel bir HAL arayüzü aracılığıyla uygulanan gralloc bellek ayırıcısı aracılığıyla gerçekleştirilir.
  • SurfaceFlinger, Hardware Composer ve sanal ekranlar . SurfaceFlinger, birden fazla kaynaktan gelen veri arabelleklerini kabul eder, bunları birleştirir ve ekrana gönderir. Donanım Oluşturucu HAL (HWC), arabellekleri mevcut donanımla birleştirmenin en etkili yolunu belirler ve sanal ekranlar, birleştirilmiş çıktıyı sistem içinde kullanılabilir hale getirir (ekranı kaydetme veya ekranı bir ağ üzerinden gönderme).
  • Yüzey, tuval ve SurfaceHolder . Bir yüzey, genellikle SurfaceFlinger tarafından tüketilen bir arabellek kuyruğu oluşturur. Bir yüzey üzerinde render alınırken sonuç, tüketiciye gönderilen bir tamponda son bulur. Canvas API'leri, doğrudan bir yüzey üzerinde çizim yapmak için (OpenGL ES'ye düşük düzeyli bir alternatif) bir yazılım uygulaması (donanım hızlandırma desteğiyle) sağlar. Görünümle ilgili her şey, API'leri boyut ve format gibi yüzey parametrelerinin alınmasına ve ayarlanmasına olanak tanıyan bir SurfaceHolder içerir.
  • EGLSurface ve OpenGL ES . OpenGL ES (GLES), işletim sistemi aracılığıyla pencereler oluşturabilen ve bunlara erişebilen bir kitaplık olan EGL ile birleştirilmek üzere tasarlanmış bir grafik oluşturma API'sini tanımlar (dokulu çokgenler çizmek için GLES çağrılarını kullanın; görüntüyü ekrana koymak için EGL çağrılarını kullanın) ). Bu sayfa aynı zamanda yerel koddan bir EGL pencere yüzeyi oluşturmak için kullanılan Java Surface sınıfının C/C++ eşdeğeri olan ANativeWindow'u da kapsar.
  • Vulkan . Vulkan, yüksek performanslı 3D grafiklere yönelik düşük maliyetli, çapraz platformlu bir API'dir. OpenGL ES gibi Vulkan da uygulamalarda yüksek kaliteli, gerçek zamanlı grafikler oluşturmaya yönelik araçlar sağlar. Vulkan'ın avantajları arasında CPU yükünün azaltılması ve SPIR-V Binary Intermediate dilinin desteklenmesi yer alır.

Üst düzey bileşenler

  • SurfaceView ve GLSurfaceView . SurfaceView, bir yüzeyi ve bir görünümü birleştirir. SurfaceView'ın görünüm bileşenleri, SurfaceFlinger (uygulama tarafından değil) tarafından birleştirilir; bu, ayrı bir iş parçacığından/işlemden görüntü oluşturmaya ve uygulama kullanıcı arayüzü oluşturma işleminden izolasyona olanak tanır. GLSurfaceView, EGL bağlamlarını, iş parçacıkları arası iletişimi ve etkinlik yaşam döngüsüyle etkileşimi yönetmek için yardımcı sınıflar sağlar (ancak GLES'i kullanmak zorunlu değildir).
  • Yüzey dokusu . SurfaceTexture, uygulamanızın tüketicisi olduğu bir BufferQueue oluşturmak için bir yüzey ile GLES dokusunu birleştirir. Bir üretici yeni bir arabelleği kuyruğa aldığında uygulamanıza bildirimde bulunur; uygulama da önceden tutulan arabelleği serbest bırakır, yeni arabelleği kuyruktan alır ve arabelleği harici bir doku olarak GLES'in kullanımına sunmak için EGL çağrıları yapar. Android 7.0, korumalı video içeriğinin GPU tarafından sonradan işlenmesine olanak tanıyan güvenli dokulu video oynatma desteği ekledi.
  • Doku Görünümü . TextureView, bir görünümü SurfaceTexture ile birleştirir. TextureView bir SurfaceTexture'ı sarar ve geri aramalara yanıt verme ve yeni arabellekler edinme sorumluluğunu üstlenir. TextureView, çizim sırasında veri kaynağı olarak en son alınan arabelleğin içeriğini kullanır ve görünüm durumu nerede ve nasıl olması gerektiğini gösterirse onu oluşturur. Görünüm kompozisyonu her zaman GLES ile gerçekleştirilir; bu, içerikteki güncellemelerin diğer görünüm öğelerinin de yeniden çizilmesine neden olabileceği anlamına gelir.