SurfaceFlinger, arabellekleri kabul eder, oluşturur ve ekrana gönderir. WindowManager
, SurfaceFlinger'a yüzeyleri ekranda birleştirmek için kullandığı arabellekleri ve pencere meta verilerini sağlar.
SurfaceFlinger
SurfaceFlinger, arabellekleri iki şekilde kabul edebilir: BufferQueue ve SurfaceControl
aracılığıyla veya ASurfaceControl
aracılığıyla.
SurfaceFlinger'ın arabellekleri kabul etmesinin bir yolu BufferQueue ve SurfaceControl
'tir. Bir uygulama ön plana geldiğinde WindowManager
'ten arabelleğe alma isteği gönderir. WindowManager
daha sonra SurfaceFlinger'dan bir katman ister. Katman, BufferQueue'ı içeren bir yüzey ile görüntü çerçevesi gibi katman meta verilerini içeren bir SurfaceControl
örneğinin birleşimidir.
SurfaceFlinger, katmanı oluşturur ve WindowManager
'e gönderir. WindowManager
, yüzeyi uygulamaya gönderir ancak uygulamanın ekrandaki görünümünü değiştirmek için SurfaceControl
örneğini tutar.
Android 10, SurfaceFlinger'ın arabellekleri kabul etmesinin başka bir yolu olan ASurfaceControl
özelliğini ekler. ASurfaceControl
, bir yüzeyi ve SurfaceControl
örneğini SurfaceFlinger'a gönderilen tek bir işlem paketinde birleştirir. ASurfaceControl
, uygulamaların ASurfaceTransaction
örnekleri aracılığıyla güncellediği bir katmanla ilişkilidir. Ardından uygulamalar, ASurfaceTransaction
örnekleri hakkında bilgi almak için ASurfaceTransactionStats
'u geçiren geri çağırma işlevlerini kullanır. Bu bilgiler arasında sabitleme zamanı ve edinme süreleri gibi bilgiler bulunur.
Aşağıdaki tabloda, ASurfaceControl
ve ilişkili bileşenleri hakkında daha fazla bilgi verilmektedir:
Bileşen | Açıklama |
---|---|
ASurfaceControl |
SurfaceControl 'ü sarmalayarak uygulamaların ekrandaki katmanlara karşılık gelen SurfaceControl örnekleri oluşturmasını sağlar.ANativeWindow veya başka bir ASurfaceControl örneğinin alt öğesi olarak oluşturulabilir. |
ASurfaceTransaction |
İstemcinin bir katmanın geometri gibi açıklayıcı özelliklerini düzenlemesine olanak tanımak için Transaction 'ü sarmalar ve güncellenmiş arabellekleri SurfaceFlinger'a gönderir. |
ASurfaceTransactionStats
| Önceden kaydedilmiş bir geri çağırma işlevi aracılığıyla, sunulan işlemlerle ilgili bilgileri (ör. kilitleme zamanı, edinme zamanları ve önceki sürüm çiti) bir uygulamaya gönderir. |
Uygulamalar herhangi bir zamanda arabellek gönderebilse de SurfaceFlinger yalnızca ekran yenilemeleri arasındaki arabellekleri kabul etmek için uyanır. Bu durum cihaza göre değişiklik gösterebilir. Bu, bellek kullanımını en aza indirir ve ekran yenilenirken güncelleme yapıldığında ortaya çıkabilecek ekranda görünür yırtılmaların oluşmasını önler.
Ekran yenileme işlemi arasındayken VSync sinyalini SurfaceFlinger'a gönderir. VSync sinyali, ekranın yırtılmadan yenilenebildiğini gösterir. SurfaceFlinger, VSync sinyalini aldığında yeni arabellekler aramak için katman listesinde gezinir. SurfaceFlinger yeni bir arabellek bulursa arabelleği edinir. Aksi takdirde, daha önce edinilen arabelleği kullanmaya devam eder. SurfaceFlinger her zaman bir şey göstermesi gerektiğinden tek bir arabelleğe bağlı kalır. Bir katmanda hiç arabellek gönderilmediyse katman yoksayılır.
SurfaceFlinger, görünür katmanlar için tüm arabellekleri topladıktan sonra donanım derleyiciye (HWC) kompozisyonun nasıl gerçekleştirileceğini sorar. HWC, katman kompozisyon türünü istemci kompozisyonu olarak işaretliyorsa SurfaceFlinger bu katmanları birleştirir. Ardından SurfaceFlinger, çıkış arabelleğini HWC'ye iletir.
WindowManager
WindowManager
, View
nesnelerinin kapsayıcısı olan Window
nesnelerini kontrol eder. Window
nesneleri her zaman Surface
nesneleri tarafından desteklenir.
WindowManager
, yaşam döngülerini, giriş ve odak etkinliklerini, ekran yönünü, geçişleri, animasyonları, konumu, dönüştürme işlemlerini, z-sırasını ve bir pencerenin diğer birçok yönünü yönetir. WindowManager
, tüm pencere meta verilerini SurfaceFlinger'a gönderir. Böylece SurfaceFlinger, ekrandaki yüzeyleri birleştirmek için bu verileri kullanabilir.
Rotasyon öncesi
Birçok donanım yer paylaşımı döndürmeyi desteklemez (destekleseler bile işlem gücü gerektirir). Çözüm, arabelleği SurfaceFlinger'a ulaşmadan önce dönüştürmektir. Android, SurfaceFlinger tarafından arabelleğe uygulanacak en olası dönüştürme işlemini temsil etmek için ANativeWindow
içinde bir sorgu ipucu (NATIVE_WINDOW_TRANSFORM_HINT
) destekler. GL sürücüleri, bu ipucunu kullanarak arabelleği SurfaceFlinger'a ulaşmadan önce önceden dönüştürebilir. 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, sayfanın sonuna ulaşmasını önlemek için arabelleğe bir matris oluşturup uygulayın. Güç tasarrufu yapmak için bu işlemi önceden yapın. Ayrıntılar için system/core/include/system/window.h
bölümünde tanımlanan ANativeWindow
arayüzüne bakın.