SurfaceFlinger, arabellekleri kabul eder, oluşturur ve ekrana gönderir. WindowManager
, SurfaceFlinger'a arabellekler ve pencere meta verileri sağlar. SurfaceFlinger daha sonra bunları, yüzeyleri ekranda birleştirmek için kullanır.
SurfaceFlinger
SurfaceFlinger, arabellekleri iki şekilde kabul edebilir: BufferQueue ve SurfaceControl
aracılığıyla veya ASurfaceControl
aracılığıyla.
SurfaceFlinger'ın arabellekleri kabul etme yöntemlerinden biri BufferQueue ve
SurfaceControl
'dur. Bir uygulama ön plana geldiğinde WindowManager
kaynağından arabellek ister. WindowManager
, SurfaceFlinger'dan bir katman ister. Katman, BufferQueue'yu içeren bir yüzey ile ekran çerçevesi gibi katman meta verilerini içeren bir SurfaceControl
örneğinin birleşimidir.
SurfaceFlinger, katmanı oluşturur ve WindowManager
'ya gönderir. WindowManager
ardından yüzeyi uygulamaya gönderir ancak SurfaceControl
örneğini, uygulamanın ekrandaki görünümünü değiştirmek için saklar.
Android 10'dan itibaren ASurfaceControl
, SurfaceFlinger'ın arabellekleri kabul etmesi için başka bir yol sunar. ASurfaceControl
, bir yüzeyi ve SurfaceControl
örneğini, SurfaceFlinger'ın aldığı tek bir işlem paketinde birleştirir. ASurfaceControl
, uygulamaların ASurfaceTransaction
örnekleri aracılığıyla güncellediği bir katmanla ilişkilendirilir. Uygulamalar daha sonra, örneğin kilitlenme süresi ve edinme süreleri gibi bilgileri içeren ASurfaceTransactionStats
ileten geri çağırmalar aracılığıyla ASurfaceTransaction
örnekleri hakkında bilgi alır.
Aşağıdaki tabloda ASurfaceControl
ve ilişkili bileşenleri açıklanmaktadır:
Bileşen | Açıklama |
---|---|
ASurfaceControl |
Wraps SurfaceControl ve bir uygulamanın, ekrandaki katmanlara karşılık gelen SurfaceControl örnekleri oluşturmasına olanak tanır.ANativeWindow öğesinin veya başka bir ASurfaceControl örneğinin alt öğesi olarak oluşturulabilir. |
ASurfaceTransaction |
Müşterinin bir katmanın açıklayıcı özelliklerini (ör. geometri) düzenlemesine olanak tanımak için Transaction sarmalar ve güncellenen arabellekleri SurfaceFlinger'a gönderir. |
ASurfaceTransactionStats |
Sunulan işlemlerle ilgili bilgileri (ör. kilitlenme süresi, edinme süreleri ve önceki yayınlanma sınırı) önceden kaydedilmiş bir geri çağırma yoluyla uygulamaya gönderir. |
Uygulamalar arabellekleri istedikleri zaman gönderebilse de SurfaceFlinger yalnızca ekran yenilemeleri arasında arabellekleri kabul etmek için uyanır. Bu süre cihaza göre değişebilir. Bu, bellek kullanımını en aza indirir ve ekran yenileme ortasında ekran güncellenirken oluşabilecek görünür yırtılmaları önler.
Ekran yenilenmeler arasında olduğunda ekran, VSync sinyalini SurfaceFlinger'a gönderir. VSync sinyali, ekranı yırtılma olmadan yenileyebileceğini gösterir. SurfaceFlinger, VSync sinyalini aldığında yeni arabellekler aramak için katman listesini tarar. Yeni bir arabellek bulursa SurfaceFlinger arabelleği alır, bulamazsa daha önce alınan arabelleği kullanmaya devam eder. SurfaceFlinger her zaman bir şeyler göstermelidir. Bu nedenle, bir arabelleği tutar. Bir katmana hiç arabellek gönderilmediyse SurfaceFlinger katmanı yok sayar.
SurfaceFlinger, görünür katmanlar için tüm arabellekleri topladıktan sonra Hardware Composer'a (HWC) kompozisyonu nasıl gerçekleştirmesi gerektiğini sorar. HWC, katman bileşimi türünü istemci bileşimi olarak işaretlerse SurfaceFlinger bu katmanları birleştirir. Ardından, SurfaceFlinger çıktı arabelleğini HWC'ye iletir.
WindowManager
WindowManager
, Window
nesnelerini kontrol eder. Bu nesneler, View
nesnelerinin kapsayıcılarıdır. Window
nesneler her zaman Surface
nesnelerle desteklenir.
WindowManager
yaşam döngülerini, giriş ve odaklanma etkinliklerini, ekran yönünü, geçişleri, animasyonları, konumu, dönüşümleri, z-sırasını ve bir pencerenin diğer birçok yönünü yönetir. WindowManager
, pencere meta verilerinin tamamını SurfaceFlinger'a gönderir. Böylece SurfaceFlinger, bu verileri kullanarak ekrandaki yüzeyleri birleştirebilir.
Rotasyon öncesi
Birçok donanım katmanı döndürmeyi desteklemez (desteklese bile işlem gücü gerekir). Çözüm, arabellek SurfaceFlinger'a ulaşmadan önce dönüştürmektir. Android, SurfaceFlinger'ın arabelleğe uygulayacağı en olası dönüşümü temsil etmek için ANativeWindow
içinde bir sorgu ipucunu (NATIVE_WINDOW_TRANSFORM_HINT
) destekler.
GL sürücüleri, arabellek SurfaceFlinger'a ulaşmadan önce önceden dönüştürmek için bu ipucunu kullanabilir. Böylece arabellek geldiğinde doğru şekilde dönüştürülmüş olur.
Örneğin, 90 derece döndürme ipucu aldığınızda arabelleğin sayfanın sonuna ulaşmasını önlemek için bir matris oluşturup arabelleğe uygulayın. Güç tasarrufu için bu işlemi döndürme öncesinde yapın. Ayrıntılar için ANativeWindow
arayüzünün system/core/include/system/window.h
içinde tanımlandığı bölüme bakın.