Katmanlar ve ekranlar

Katmanlar ve ekranlar, kompozisyon çalışmasını ve ekran donanımıyla etkileşimleri temsil eden iki temel öğedir.

Katmanlar

Katman, kompozisyonun en önemli birimidir. Katman, yüzey ve SurfaceControl örneğinin birleşimidir. Her katmanın, diğer katmanlarla nasıl etkileşime gireceğini tanımlayan bir özellikler grubu vardır. Katman özellikleri aşağıdaki tabloda açıklanmıştır:

Özellik Açıklama
Konuma Dayalı Katmanın ekranda nerede görüneceğini tanımlar. Bir 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österilen içeriğin, konum özellikleriyle tanımlanan sınırlar içinde nasıl sunulacağını tanımlar. Kırpma (içeriğin bir bölümünü katmanın sınırlarını dolduracak şekilde genişletme) ve dönüştürme (döndürülmüş veya ters çevrilmiş içeriği gösterme) gibi bilgiler içerir.
Beste Katmanın diğer katmanlarla nasıl birleştirileceğini tanımlar. Alfa bileştirme için karıştırma modu ve katman genelinde alfa değeri gibi bilgiler içerir.
Optimizasyon Katmanın doğru şekilde birleştirilmesi için kesinlikle gerekli olmayan ancak donanım birleştirici (HWC) cihazı tarafından birleştirme işleminin nasıl gerçekleştirileceğini optimize etmek için kullanılabilecek bilgileri sağlar. Katmanın görünür bölgesi ve önceki kareye göre katmanın hangi kısmının güncellendiği gibi bilgileri içerir.

Ekranlar

Görüntü, kompozisyonun bir diğer önemli birimidir. Bir sistemde birden fazla ekran olabilir ve normal sistem işlemleri sırasında ekranlar eklenebilir veya kaldırılabilir. Görüntüler, HWC'nin veya çerçeve isteği üzerine eklenir ya da kaldırılır. HWC cihazı, harici bir ekran cihaza bağlandığında veya cihazdan çıkarıldığında ekranların eklenmesini ya da kaldırılmasını ister. Bu işleme hotplugging adı verilir. İstemciler, içerikleri fiziksel bir ekrana değil, ekran dışı bir arabelleğe işlenen sanal ekranlar ister.

Sanal ekranlar

SurfaceFlinger, dahili ekranı (telefon veya tablete yerleşik), harici ekranları (ör. HDMI ile bağlı bir televizyon) ve sistemde birleştirilmiş çıkışın kullanılabilir olmasını sağlayan bir veya daha fazla sanal ekranı destekler. Sanal ekranlar, ekranı kaydetmek veya bir ağ üzerinden göndermek için kullanılabilir. Sanal ekran için oluşturulan kareler BufferQueue'ya yazılır.

Sanal ekranlar, ana ekranla aynı katman grubunu (katman yığını) paylaşabilir veya kendi katman grubuna sahip olabilir. Sanal ekran için VSync olmadığından dahili ekranın VSync'i tüm ekranlar için birleştirme işlemini tetikler.

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 diskte MP4 dosyası olarak kaydetmesine olanak tanır. Bunu uygulamak için sistem, 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önetildiğinden büyük grafik arabelleklerinin sistemde hareket etmesi gerekir. Daha zorlu bir hedef olarak, tam çözünürlükte 60 FPS video kaydetmek amaçlanmıştır. Bu işlemin verimli bir şekilde yapılmasını sağlayan temel unsur BufferQueue'dur.

MediaCodec sınıfı, bir uygulamanın arabelleklerde veya bir yüzey aracılığıyla verileri 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ı bir yüzey olarak screenrecord'ya geri geçirir.

Ardından screenrecord yardımcı programı, SurfaceFlinger'dan ana ekranı yansıtan (yani aynı katmanlara sahip) bir sanal ekran oluşturmasını ister ve çıkışı screenrecord işleminden gelen yüzeye göndermesini yönlendirir.mediaserver Bu durumda, SurfaceFlinger arabelleklerin tüketicisi değil üreticisidir.

Yapılandırma tamamlandıktan sonra, kodlanmış veriler göründüğünde screenrecord tetiklenir. Uygulamalar çizim yaptıkça arabellekleri SurfaceFlinger'a gider. SurfaceFlinger, bu arabellekleri tek bir arabellek halinde birleştirir ve mediaserver sürecinde doğrudan video kodlayıcıya gönderir. Tam kareler hiçbir zaman screenrecord işlemi tarafından görülmez. Dahili olarak, mediaserver işlemi, arabellekleri kendi yöntemleriyle taşır. Bu yöntem, verileri tutamaçla da geçirerek ek yükü en aza indirir.

Örnek olay: İkincil ekranları simüle etme

WindowManager, SurfaceFlinger'dan SurfaceFlinger'ın BufferQueue tüketicisi olarak hareket ettiği görünür bir katman oluşturmasını isteyebilir. Ayrıca, SurfaceFlinger'dan sanal ekran oluşturmasını da isteyebilirsiniz. Bu durumda SurfaceFlinger, BufferQueue üreticisi olarak hareket eder.

Görünür bir katmana sanal ekran bağlarsanız bir pencerede birleştirilmiş ekranın göründüğü kapalı bir döngü oluşturulur. Bu pencere artık birleştirilmiş çıkışın bir parçasıdır. Bu nedenle, bir sonraki yenilemede pencerenin içindeki birleştirilmiş görüntüde pencere içerikleri de gösterilir. Bu özelliği kullanmak için Ayarlar'da Geliştirici seçenekleri'ni etkinleştirin, İkincil ekranları simüle et'i seçin ve bir pencereyi etkinleştirin. İkincil ekranların nasıl çalıştığını görmek için screenrecord tuşunu kullanarak ekranı etkinleştirme işlemini kaydedin ve ardından kare kare oynatın.