Katmanlar ve ekranlar, kompozisyon çalışmalarını ve ekran donanımıyla etkileşimleri temsil eden iki temel öğedir.
Katmanlar
Katman, kompozisyonun en önemli birimidir. Katman, bir yüzey ile SurfaceControl
örneğinin birleşimidir. Her katmanın, diğer katmanlarla nasıl etkileşimde bulunduğunu tanımlayan bir dizi özelliği vardır. Katman özellikleri, aşağıdaki tabloda açıklanmıştır.
Özellik | Açıklama |
---|---|
Konumsal | Katmanın ekranda nerede görüneceğini tanımlar. Katmanın kenarlarının konumları ve diğer katmanlara göre Z sırası (diğer katmanların önünde mi yoksa arkasında mı olması gerektiği) gibi bilgileri içerir. |
İçerik | Katmanda görüntülenen içeriğin, konumsal özellikler tarafından tanımlanan sınırlar içinde nasıl sunulacağını belirtir. Kırpma (içeriğin bir bölümünü katmanın sınırlarını dolduracak şekilde genişletmek için) ve dönüştürme (döndürülmüş veya ters çevrilmiş içeriği göstermek için) gibi bilgiler içerir. |
Beste | Katmanın diğer katmanlarla nasıl birleştirileceğini tanımlar. Karıştırma modu ve alfa oluşturma için katman genelinde bir alfa değeri gibi bilgileri içerir. |
Optimizasyon | Katmanı doğru şekilde birleştirmek için kesinlikle gerekli olmayan ancak Donanım Oluşturucu (HWC) cihazı tarafından, bileşim performansını optimize etmek için kullanılabilen bilgileri sağlar. Katmanın görünür bölgesi ve katmanın önceki kareden bu yana hangi kısmının güncellendiği gibi bilgileri içerir. |
Ekranlar
Görüntü, kompozisyonun diğer önemli bir birimidir. Bir sistemde birden fazla ekran bulunabilir ve normal sistem işlemleri sırasında ekranlar eklenebilir veya kaldırılabilir. Ekranlar, HWC'nin veya çerçevenin talebi üzerine eklenir/kaldırılır. HWC cihaz, harici bir ekran cihaza bağlandığında veya cihazdan ayrıldığında ekranların eklenmesini ya da kaldırılmasını ister. Buna sıcak bağlama denir. İstemciler, içerikleri fiziksel bir ekran yerine ekran dışı bir arabelleğe oluşturulan sanal ekranlar ister.
Sanal ekranlar
SurfaceFlinger, dahili ekranı (telefona veya tablete yerleştirilmiş), harici ekranları (HDMI üzerinden bağlı bir televizyon gibi) ve sistemde birleştirilmiş çıkışı sunan bir veya daha fazla sanal ekranı destekler. Sanal ekranlar, ekranı kaydetmek veya ekranı bir ağ üzerinden göndermek için kullanılabilir. Sanal ekran için oluşturulan kareler bir BufferQueue'a yazılır.
Sanal ekranlar ana ekranla (katman yığını) aynı katman grubunu paylaşabilir veya kendi gruplarına sahip olabilir. Sanal ekran için VSYNC yoktur. Bu nedenle, dahili ekranın VSYNC'si tüm ekranların kompozisyonunu tetikler.
Bunları destekleyen HWC uygulamalarında sanal ekranlar OpenGL ES (GLES), HWC veya hem GLES hem de HWC ile birleştirilebilir. Desteklenmeyen uygulamalarda sanal ekranlar her zaman GLES kullanılarak birleştirilir.
Örnek olay: screenrecord
screenrecord
komutu, kullanıcının ekranda görünen her şeyi diske .mp4
dosyası olarak kaydetmesine olanak tanır. Sistem bunu uygulamak için SurfaceFlinger'dan birleştirilmiş kareler alır, bunları video kodlayıcıya yazar ve ardından kodlanmış video verilerini bir dosyaya yazar. Video codec'leri ayrı bir işlem (mediaserver
) tarafından yönetilir. Bu nedenle, büyük grafik arabelleklerinin sistemde hareket etmesi gerekir. Daha da zorlaştırmak için hedef, tam çözünürlükte 60 FPS video kaydetmektir. Bu çözümü verimli bir şekilde yapmanın yolu BufferQueue'dur.
MediaCodec
sınıfı, uygulamaların verileri arabelleklerde veya bir yüzey aracılığıyla ham bayt olarak sağlamasına olanak tanır. screenrecord
bir video kodlayıcıya erişim istediğinde mediaserver
işlemi bir BufferQueue oluşturur, kendisini tüketici tarafına bağlar ve ardından üretici tarafını yüzey olarak tekrar screenrecord
öğesine iletir.
Ardından screenrecord
yardımcı programı, SurfaceFlinger'dan ana ekranı yansıtan (yani aynı katmanların tümüne sahip) bir sanal ekran oluşturmasını ister ve mediaserver
işleminden gelen çıkışı yüzeye göndermesini yönlendirir. Bu durumda SurfaceFlinger, tüketici yerine arabelleklerin üreticisidir.
Yapılandırma tamamlandıktan sonra, kodlanmış veriler göründüğünde screenrecord
tetiklenir. Uygulamalar çizim yaparken arabellekleri SurfaceFlinger'a hareket eder. SurfaceFlinger bunları mediaserver
işleminde doğrudan video kodlayıcıya gönderilen tek bir arabellekte birleştirir. screenrecord
işlemi, tam kareleri hiçbir zaman görmez. mediaserver
işleminin dahili olarak, arabellekleri taşımak için kendi yöntemi vardır. Bu yöntem, verileri de tutamak üzerinden aktararak ek maliyeti en aza indirir.
Örnek olay: ikincil ekranları simüle etme
WindowManager, SurfaceFlinger'dan SurfaceFlinger'ın BufferQueue tüketicisi olarak davranacağı görünür bir katman oluşturmasını isteyebilir. SurfaceFlinger'dan sanal bir ekran oluşturmasını istemek de mümkündür. Bu durumda SurfaceFlinger, BufferQueue üreticisi olarak çalışır.
Görünen bir katmana sanal ekran bağlarsanız birleştirilmiş ekranın bir pencerede göründüğü kapalı bir döngü oluşturulur. Bu pencere artık birleştirilmiş çıkışın bir parçası olduğundan, bir sonraki yenilemede pencere içindeki birleştirilmiş resimde pencere içeriği de gösterilir. Bu özelliğin nasıl çalıştığını görmek için Ayarlar'da Geliştirici seçenekleri'ni etkinleştirin, İkincil ekranları simüle et'i seçin ve bir pencere etkinleştirin. İkincil ekranları çalışırken görmek için screenrecord
düğmesini kullanarak ekranı etkinleştirme işlemini kaydedin ve ardından kare kare oynatın.