SurfaceFlinger ve WindowManager

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.