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.