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 unsurları ve bunların uygulama çerçevesi ile multimedya sistemi tarafından nasıl kullanıldığı açıklanmaktadır. Burada odak noktası, grafik verilerinin arabelleklerinin sistemde 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 cihazlar ve uygulama geliştirme hakkında temel bilgilere sahip olduğunuz varsayılır. Uygulama çerçevesi hakkında ayrıntılı bilgiye ihtiyacınız yoktur ve çok az API çağrısından bahsedilir ancak materyal, diğer herkese açık belgelerle çakışmaz. Amaç, bir kareyi oluşturup çıkışa aktarmayla ilgili önemli etkinlikler hakkında ayrıntılı bilgi vererek uygulama tasarlarken bilinçli seçimler yapmanıza yardımcı olmaktır. Bu nedenle, bu belgede kullanıcı arayüzü sınıflarının nasıl kullanılabileceği değil, nasıl çalıştığı açıklanarak alttan üste doğru bir yaklaşım izlenir.
Bu bölümde, arka plan materyalinden HAL ayrıntılarına ve kullanım alanlarına kadar her şeyi kapsayan çeşitli sayfalar yer alır. Android grafik arabelleklerinin açıklanmasıyla başlayan bu dokümanda, birleştirme ve görüntüleme mekanizması açıklanır. Ardından, birleştirme işlemcisine veri sağlayan daha üst düzey mekanizmalar anlatılır. İlginç gelen bir konuya atlamak yerine sayfaları aşağıdaki sırayla okumanızı öneririz.
Düşük düzeyli bileşenler
- BufferQueue ve gralloc. BufferQueue, grafik verileri arabellekleri oluşturan bir öğeyi (üretici), verileri görüntüleme veya daha fazla işleme için kabul eden bir öğeye (tüketici) bağlar. Arabellek ayırma işlemleri, tedarikçiye özel bir HAL arayüzü aracılığıyla uygulanan gralloc bellek ayırıcı üzerinden 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 Composer HAL (HWC), arabellekleri mevcut donanımla birleştirmenin en verimli yolunu belirler ve sanal ekranlar, birleştirilmiş çıkışı sistemde kullanılabilir hâle getirir (ekranı kaydetme veya ekranı bir ağ üzerinden gönderme).
- Surface, canvas ve SurfaceHolder. Bir yüzey, genellikle SurfaceFlinger tarafından kullanılan bir arabellek sırası oluşturur. Bir yüzeye oluşturma işlemi yapıldığında sonuç, tüketiciye gönderilen bir arabellekte yer alır. Canvas API'leri, doğrudan bir yüzeye çizim yapmak için (OpenGL ES'ye düşük seviyeli bir alternatif) donanım hızlandırma desteğiyle birlikte bir yazılım uygulaması sağlar. Görünümle ilgili her şey, SurfaceHolder'ı içerir. SurfaceHolder'ın API'leri, boyut ve biçim gibi yüzey parametrelerinin alınmasını ve ayarlanmasını sağlar.
- EGLSurface ve OpenGL ES. OpenGL ES (GLES), EGL ile birlikte kullanılmak üzere tasarlanmış bir grafik oluşturma API'sini tanımlar. EGL, işletim sistemi aracılığıyla pencereler oluşturup erişebilen bir kitaplıktır (dokulu çokgenler çizmek için GLES çağrılarını, oluşturmayı ekrana yerleştirmek için EGL çağrılarını kullanın). Bu sayfada, yerel koddan EGL pencere yüzeyi oluşturmak için kullanılan Java Surface sınıfının C/C++ karşılığı olan ANativeWindow da ele alınmaktadır.
- Vulkan. Vulkan, yüksek performanslı 3D grafikler için düşük ek yüke sahip, platformlar arası bir API'dir. OpenGL ES gibi Vulkan da uygulamalarda yüksek kaliteli ve gerçek zamanlı grafikler oluşturmak için araçlar sağlar. Vulkan'ın avantajları arasında CPU genel giderlerinde azalma 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'in görünüm bileşenleri SurfaceFlinger tarafından birleştirilir (uygulama tarafından değil). Bu sayede, ayrı bir iş parçacığı/işlemden oluşturma ve uygulama kullanıcı arayüzü oluşturmadan yalıtım sağlanı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 kullanmak için gerekli değildir).
- SurfaceTexture. SurfaceTexture, uygulamanızın tüketicisi olduğu bir BufferQueue oluşturmak için yüzey ve GLES dokusunu birleştirir. Bir üretici yeni bir arabellek sıraya aldığında uygulamanızı bilgilendirir. Uygulamanız da daha önce tutulan arabelleği serbest bırakır, sıradan yeni arabelleği alır ve arabelleği GLES'te harici bir doku olarak kullanılabilir hale getirmek için EGL çağrıları yapar. Android 7.0, güvenli doku videosu oynatmaya destek ekleyerek korumalı video içeriklerinin GPU ile sonradan işlenmesini sağladı.
- TextureView. TextureView, bir görünümü SurfaceTexture ile birleştirir. TextureView, SurfaceTexture'ı sarmalar ve geri çağırmalara yanıt vermekten ve yeni arabellekler edinmekten sorumludur. Çizim yaparken TextureView, en son alınan arabelleğin içeriğini veri kaynağı olarak kullanır ve görünüm durumu ne zaman ve nasıl gösterilmesi gerektiğini belirtiyorsa o şekilde oluşturur. Görünüm oluşturma işlemi her zaman GLES ile yapılır. Bu nedenle, içeriklerdeki güncellemeler diğer görünüm öğelerinin de yeniden çizilmesine neden olabilir.