Katmanlar ve ekranlar, kompozisyon çalışmaları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şimde bulunduğunu tanımlayan bir dizi özelliği vardır. Katman özellikleri aşağıdaki tabloda açıklanmıştır:
Özellik | Açıklama |
---|---|
Konumsal | Katmanın ekranda nerede görüneceğini tanımlar. 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 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ştirileceğini tanımlar. Karıştırma modu ve alfa oluşturma için katman genelinde bir alfa değeri gibi bilgileri içerir. |
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. Katmanın görünür bölgesi ve katmanın önceki kareden bu yana hangi kısmının güncellendiği gibi bilgileri içerir. |
Ekranlar
Görüntü, kompozisyonun diğer önemli bir birimidir. Bir sistemde birden fazla ekran bulunabilir ve normal sistem işlemleri sırasında ekranlar eklenebilir veya kaldırılabilir. Ekranlar, donanım kontrol biriminin veya çerçevenin isteği üzerine eklenir ya da kaldırılır. HWC cihaz, harici bir ekran cihaza bağlandığında veya cihazdan ayrıldığında ekranların eklenmesini ya da kaldırılmasını ister. Buna sıcak bağlama denir. İ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. Sanal ekran için oluşturulan kareler bir BufferQueue'a yazılır.
Sanal ekranlar, ana ekranla aynı katman grubunu (katman grubu) paylaşabilir veya kendi katman grubuna sahip olabilir. Sanal ekran için VSync yoktur. Bu nedenle, dahili ekran için VSync tüm ekranların kompozisyonunu 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: screenrecord
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. Daha da zorlaştırmak için hedef, tam çözünürlükte 60 FPS video kaydetmektir. Bu işlemin verimli bir şekilde yapılmasının anahtarı BufferQueue'tır.
MediaCodec
sınıfı, uygulamanın verileri arabelleklerde veya bir yüzey aracılığıyla 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, tüketici tarafına bağlanır ve ardından üretici tarafını bir yüzey olarak screenrecord
'e geri iletir.
Ardından screenrecord
yardımcı programı, SurfaceFlinger'dan ana ekranı yansıtan (yani aynı katmanların tümüne sahip olan) bir sanal ekran oluşturmasını ister ve mediaserver
işleminden gelen çıkışı yüzeye göndermesini yönlendirir. Bu durumda SurfaceFlinger, tüketici yerine arabelleklerin üreticisidir.
Yapılandırma tamamlandıktan sonra, kodlanmış veriler göründüğünde screenrecord
tetiklenir. Uygulamalar çizim yaparken tamponları SurfaceFlinger'a gider. SurfaceFlinger, bunları mediaserver
sürecinde doğrudan video kodlayıcıya gönderilen tek bir tamponda birleştirir. Tam kareler hiçbir zaman screenrecord
işlemi tarafından görülmez. mediaserver
işleminin dahili olarak, arabellekleri taşımak için kendi yöntemi vardır. Bu yöntem, verileri de tutamak üzerinden aktararak ek maliyeti 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. SurfaceFlinger'dan sanal ekran oluşturmasını da isteyebilirsiniz. Bu durumda SurfaceFlinger, BufferQueue üreticisi olarak çalışır.
Görünen bir katmana sanal 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ş çı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.