Katmanlar ve görüntüler

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.