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, bir yüzey ile SurfaceControl
örneğinin birleşimidir. Her katmanın diğer katmanlarla nasıl etkileşime gireceğini tanımlayan bir dizi özelliği vardır. Katman özellikleri aşağıdaki tabloda açıklanmıştır.
Mülk | Tanım |
---|---|
Konumsal | 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örüntülenen içeriğin, konumsal özellikler tarafından tanımlanan sınırlar dahilinde nasıl sunulması gerektiğini tanımlar. Kırpma (katmanın sınırlarını dolduracak şekilde içeriğin bir kısmını genişletmek için) ve dönüştürme (döndürülmüş veya çevrilmiş içeriği göstermek için) gibi bilgileri içerir. |
Kompozisyon | Katmanın diğer katmanlarla nasıl birleştirilmesi gerektiğini tanımlar. Harmanlama modu ve alfa birleştirme için katman çapında alfa değeri gibi bilgileri içerir. |
Optimizasyon | Katmanı doğru bir şekilde birleştirmek için kesinlikle gerekli olmayan ancak Donanım Oluşturucu (HWC) cihazının kompozisyonu nasıl gerçekleştirdiğini optimize etmek için kullanılabilen bilgileri sağlar. Katmanın görünür bölgesi ve önceki kareden bu yana katmanın hangi bölümünün güncellendiği gibi bilgileri içerir. |
Gösterimler
Bir sergi, kompozisyonun bir diğer önemli birimidir. Bir sistemde birden fazla ekran bulunabilir ve normal sistem işlemleri sırasında ekranlar eklenebilir veya kaldırılabilir. HWC'nin talebi veya çerçevenin talebi üzerine ekranlar eklenir/kaldırılır. HWC cihazı, cihaza harici bir ekran bağlandığında veya cihazla bağlantısı kesildiğinde ekranların eklenmesini veya kaldırılmasını ister; buna çalışırken takma adı verilir. İstemciler, içerikleri fiziksel ekran yerine ekran dışı ara belleğe aktarılan sanal ekranlar talep eder.
Sanal görüntüler
SurfaceFlinger, dahili bir ekranı (telefonda veya tablette yerleşik), harici ekranları (HDMI aracılığıyla bağlanan bir televizyon gibi) ve sistem içinde birleştirilmiş çıktı sağlayan bir veya daha fazla sanal ekranı destekler. Sanal ekranlar, ekranı kaydetmek veya ekranı bir ağ üzerinden göndermek için kullanılabilir. Sanal bir ekran için oluşturulan kareler BufferQueue'ya yazılır.
Sanal ekranlar, ana ekranla (katman yığını) aynı katman kümesini paylaşabilir veya kendi kümelerine sahip olabilir. Sanal ekran için VSYNC yoktur, bu nedenle dahili ekranın VSYNC'si tüm ekranlar için kompozisyonu 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: ekran kaydı
screenrecord
komutu, kullanıcının ekranda görünen her şeyi diske .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önetilir, dolayısıyla büyük grafik arabelleklerinin sistem içinde hareket etmesi gerekir. Bunu daha da zorlaştırmak için amaç, tam çözünürlükte 60 fps video kaydetmektir. Bu işi verimli bir şekilde yapmanın anahtarı BufferQueue'dur.
MediaCodec
sınıfı, bir uygulamanın arabelleklerde veya bir yüzey aracılığıyla verileri ham baytlar halinde sağlamasına olanak tanır. screenrecord
bir video kodlayıcıya erişim istediğinde, mediaserver
süreci bir BufferQueue oluşturur, kendisini tüketici tarafına bağlar ve ardından üretici tarafını bir yüzey olarak screenrecord
geri gönderir.
screenrecord
yardımcı programı daha sonra SurfaceFlinger'dan ana ekranı yansıtan (yani tüm katmanlara sahip) sanal bir ekran oluşturmasını ister ve mediaserver
işleminden gelen çıktıyı yüzeye göndermesi için onu yönlendirir. Bu durumda SurfaceFlinger tüketiciden çok tampon üreticisi konumundadır.
Yapılandırma tamamlandıktan sonra, kodlanmış veriler göründüğünde screenrecord
tetiklenir. Uygulamalar çekildikçe arabellekleri SurfaceFlinger'a gider ve bu da onları mediaserver
işleminde doğrudan video kodlayıcıya gönderilen tek bir arabellekte birleştirir. screenrecord
işleminde tam kareler hiçbir zaman görülmez. Dahili olarak, mediaserver
işleminin, arabellekleri hareket ettirmenin kendi yolu vardır; bu aynı zamanda verileri tanıtıcıdan geçirerek yükü en aza indirir.
Örnek olay: ikincil ekranları simüle edin
WindowManager, SurfaceFlinger'dan SurfaceFlinger'ın BufferQueue tüketicisi olarak görev yapacağı görünür bir katman oluşturmasını isteyebilir. SurfaceFlinger'dan, SurfaceFlinger'ın BufferQueue üreticisi olarak görev yapacağı sanal bir ekran oluşturmasını istemek de mümkündür.
Görünür bir katmana sanal bir 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ş çıktının bir parçasıdır, dolayısıyla bir sonraki yenilemede pencerenin içindeki birleştirilmiş görüntü pencere içeriğini de gösterir. Bunu çalışırken görmek için Ayarlar'da Geliştirici seçeneklerini etkinleştirin, İkincil ekranları simüle et'i seçin ve bir pencereyi etkinleştirin. İkincil ekranları çalışırken görmek için, ekranın etkinleştirilme eylemini yakalamak üzere screenrecord
kullanın ve ardından onu kare kare oynatın.