Katmanlar ve ekranlar

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

Katmanlar

Katman en önemli bileşim birimidir. Katman, Bir yüzey ve ilgili öğenin bir örneğinin SurfaceControl. Her katmanın, aynı zamanda ve diğer katmanlarla nasıl etkileşime girdiğini tanımlar. Katman özellikleri, aşağıdaki tabloda açıklanmıştır.

Özellik Açıklama
Konumsal Katmanın ekranda nerede görüneceğini tanımlar. Bilgi içerir örneğin bir katmanın kenarlarının konumları ve Z sırası katmana göre (göz önündeki veya arkasında katmanlarda yer alır).
İç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ştirilmesi gerektiğini tanımlar. Dahil olan hizmetler: alfa için karıştırma modu ve katman genelinde alfa değeri gibi bilgiler sağlar. birleştirme.
Optimizasyon Katmanı doğru şekilde birleştirmek için kesinlikle gerekli olmayan ancak donanım derleyici (HWC) cihazının, derlemeyi nasıl gerçekleştirdiğini optimize etmek için kullanabileceği bilgileri sağlar. Örneğin, görünür bölgesi ve katmanın hangi kısmının önceki kareden bu yana güncellendi.

Ekranlar

Görüntülü reklam da bir diğer önemli bileşim birimidir. Bir sistem ve birden fazla ekran Ekranlar, normal sistem işlemleri sırasında eklenebilir veya çıkarılabilir. Ekranlar, donanım kontrol biriminin veya çerçevenin isteği üzerine eklenir/kaldırılır. HWC cihaz istekleri, harici bir Cihaza bağlı veya bağlantısı kesildiğinde bu duruma kısaltma. İ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. Oluşturulan kare sayısı BufferQueue'ye yazılır.

Sanal ekranlar ana ekranla aynı katman grubunu paylaşabilir (katman yığını) veya kendi setine sahip. Sanal ekranlarda VSYNC yoktur. dahili ekran için VSYNC, tüm cihazlar için görüntüler.

Destekleyen HWC uygulamalarında, 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: ekran kaydı

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önetildiğinden büyük grafik arabelleklerinin sistemde taşınması gerekir. Bunu daha zor hale getirmek için hedef, 60 fps video kaydetmektir. tam çözünürlükte. Bu işlemin verimli bir şekilde yapılmasının anahtarı BufferQueue'tır.

MediaCodec sınıfı, uygulamanın verileri arabelleklerde ham bayt olarak sağlamasına izin verir. veya yüzeyden geçer. screenrecord bir videoya erişim istediğinde mediaserver işlemi bir BufferQueue oluşturur, tarafından tüketiciye verilir, sonra da üretici tarafı Yüzey olarak screenrecord.

screenrecord yardımcı programı daha sonra SurfaceFlinger'dan bir gösteren bir sanal ekran (yani, ana ekranı katmanları) belirler ve çıktıyı, yeni ekran katmanından gelen yüzeye mediaserver işlem. Bu durumda SurfaceFlinger, tüketici yerine arabelleklerin üreticisidir.

Yapılandırma tamamlandıktan sonra, screenrecord şifrelenmiş veriler görünür. Uygulamalar çizim yaparken tamponları SurfaceFlinger'a gider. SurfaceFlinger, bunları tek bir tamponda 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 süreci, tamponları kendi metriğe göre verileri tutma yerine göre iletir ve ek yükü en aza indirir.

Örnek olay: ikincil ekranları simüle etme

WindowManager, SurfaceFlinger'dan BufferQueue tüketicisi olarak hareket edeceği bir görünür katman oluşturmasını isteyebilir. Ayrıca mevcut bir iş görüşmesinde SurfaceFlinger'ın sanal bir görüntü oluşturmak için kullandığı, SurfaceFlinger'ın son derece önemlidir.

Sanal bir ekranı görünür bir katmana bağlarsanız kapalı döngü oluşturulur. bir pencerede görünür. 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.