Yüzeyler, SurfaceHolder, EGLSurface, SurfaceView, GLSurfaceView, SurfaceTexture, TextureView, SurfaceFlinger ve Vulkan hakkında her geliştiricinin bilmesi gerekenler.
Bu sayfada, Android sistem düzeyinde grafik mimarisinin temel unsurları ve bunların uygulama çerçevesi ve multimedya sistemi tarafından nasıl kullanıldığı açıklanmaktadır. Buradaki odak, grafik verilerinin arabelleklerinin sistemde nasıl hareket ettiğidir. SurfaceView ve TextureView'ın neden bu şekilde davrandığını veya yüzeylerin EGLSurface ile nasıl etkileşime girdiğini merak ettiyseniz doğru yerdesiniz.
Android cihazlara ve uygulama geliştirmeye aşina olmanız beklenir. Uygulama çerçevesi hakkında ayrıntılı bilgiye sahip olmanız gerekmez ve çok az sayıda API çağrısından bahsedilir ancak materyal, herkese açık diğer dokümanlarla örtüşmez. Amacımız, uygulama tasarlarken bilinçli seçimler yapmanıza yardımcı olmak için çıkış için bir çerçeve oluşturmayla ilgili önemli etkinliklerle ilgili ayrıntılar sunmaktır. Bunu başarmak için, kullanıcı arayüzü sınıflarının nasıl kullanılabileceğinden ziyade nasıl çalıştığıyla ilgili ayrıntıları alttan yukarıya doğru çalışarak açıklarız.
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 makalede, derleme ve görüntüleme mekanizması açıklandıktan sonra, derleyiciye veri sağlayan üst düzey mekanizmalara geçilir. İlginizi çeken bir konuya atlamak yerine sayfaları aşağıda listelenen sırayla okumanızı öneririz.
Düşük düzey bileşenler
- BufferQueue ve gralloc. BufferQueue, grafik veri 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 ayrıştırmaları, tedarikçiye özel bir HAL arayüzü aracılığıyla uygulanan gralloc bellek ayırıcısı aracılığıyla gerçekleştirilir.
- SurfaceFlinger, Donanım Bestecisi 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), mevcut donanımla arabelleklerin birleştirilmesinin en verimli yolunu belirler ve sanal ekranlar, birleştirilmiş çıkışı sistemde kullanılabilir hale getirir (ekranı kaydeder veya ekranı bir ağ üzerinden gönderir).
- Surface, canvas ve SurfaceHolder. Yüzey, genellikle SurfaceFlinger tarafından kullanılan bir arabellek kuyruğu oluşturur. Bir yüzeye oluşturulurken sonuç, tüketiciye gönderilen bir arabelleğe gönderilir. Tuval API'leri, doğrudan bir yüzeyde (OpenGL ES'e düşük düzeyde alternatif) çizim yapmak için yazılım uygulaması (donanım hızlandırma desteğiyle) sağlar. Görünümle ilgili her şey bir SurfaceHolder içerir. Bu 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), işletim sistemi üzerinden pencere oluşturabilen ve pencerelere erişebilen bir kitaplık olan EGL ile birlikte kullanılmak üzere tasarlanmış bir grafik oluşturma API'si tanımlar (dokunmuş poligonlar ç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++ eşdeğeri olan ANativeWindow da ele alınmaktadır.
- Vulkan. Vulkan, yüksek performanslı 3D grafikler için düşük maliyetli, platformlar arası bir API'dir. OpenGL ES gibi Vulkan da uygulamalarda yüksek kaliteli, gerçek zamanlı grafikler oluşturmak için araçlar sağlar. Vulkan'ın avantajları arasında CPU yükü azaltma ve SPIR-V Binary Intermediate dili desteği yer alır.
Üst düzey bileşenler
- SurfaceView ve GLSurfaceView. SurfaceView, bir yüzeyi ve görünümü birleştirir. SurfaceView'ın görünüm bileşenleri uygulama tarafından değil, SurfaceFlinger tarafından birleştirilir. Bu sayede, ayrı bir iş parçacığında/işlemde oluşturma ve uygulama kullanıcı arayüzü oluşturma işlemlerinden izolasyon sağlanır. GLSurfaceView, EGL bağlamlarını, iş parçacığı arası iletişimi ve etkinlik yaşam döngüsü ile etkileşimi yönetmek için yardımcı sınıflar sağlar (ancak GLES kullanmak için gerekli değildir).
- SurfaceTexture. SurfaceTexture, bir yüzey ve GLES dokusunu birleştirerek uygulamanızın tüketicisi olduğu bir BufferQueue oluşturur. Bir üretici yeni bir arabellek sıraya eklediğinde uygulamanızı bilgilendirir. Uygulamanız da daha önce tutulan arabelleği serbest bırakır, yeni arabelleği sıradan alır ve arabelleği harici bir doku olarak GLES'e sunmak için EGL çağrıları yapar. Android 7.0, güvenli doku video oynatma desteğini ekleyerek korunan video içeriğinin GPU'da son işlenmesini sağladı.
- TextureView. TextureView, bir görünümü SurfaceTexture ile birleştirir. TextureView, bir SurfaceTexture'yi sarar ve geri çağırmalara yanıt verme ve yeni arabellekler edinme sorumluluğunu üstlenir. TextureView, çizim yaparken veri kaynağı olarak en son alınan arabelleğin içeriğini kullanır ve görünüm durumunun belirttiği yerde ve şekilde oluşturur. Görünüm oluşturma işlemi her zaman GLES ile gerçekleştirilir. Bu, içeriklerdeki güncellemelerin diğer görüntüleme öğelerinin de yeniden çizilmesine neden olabileceği anlamına gelir.