SurfaceFlinger ve WindowManager

SurfaceFlinger arabellekleri kabul eder, arabellekleri oluşturur ve arabellekleri ekrana gönderir. WindowManager, SurfaceFlinger'a, SurfaceFlinger'ın yüzeyleri ekrana birleştirmek için kullandığı arabellekler ve pencere meta verileri sağlar.

YüzeyFlinger

SurfaceFlinger, arabellekleri iki şekilde kabul edebilir: BufferQueue ve SurfaceControl aracılığıyla veya ASurfaceControl aracılığıyla.

SurfaceFlinger'in arabellekleri kabul etmesinin bir yolu BufferQueue ve SurfaceControl'dür. Bir uygulama ön plana geldiğinde, gelen tamponlarını ister WindowManager . WindowManager daha sonra SurfaceFlinger'dan bir katman ister. Bir tabaka bir kombinasyonudur yüzey BufferQueue ve içeren, SurfaceControl görüntü çerçevesi gibi katman meta verileri içeren,. SurfaceFlinger, katmanı oluşturur ve WindowManager'a gönderir. WindowManager daha sonra yüzeyi uygulamaya gönderir, ancak uygulamanın ekrandaki görünümünü değiştirmek için SurfaceControl'ü tutar.

Android 10, SurfaceFlinger'ın arabellekleri kabul etmesinin başka bir yolu olan ASurfaceControl'ü ekler. ASurfaceControl, bir yüzey ve bir SurfaceControl'ü SurfaceFlinger'a gönderilen tek bir işlem paketinde birleştirir. ASurfaceControl, uygulamaların ASurfaceTransactions aracılığıyla güncellendiği bir katmanla ilişkilendirilir. Uygulamalar daha sonra, ASurfaceTransactionStats'ı geçen ve kilitleme süresi, edinme süreleri vb. gibi bilgileri içeren geri aramalar aracılığıyla ASurfaceTransactions hakkında bilgi alır.

Aşağıdaki tablo, ASurfaceControl ve ilgili bileşenleri hakkında daha fazla ayrıntı içerir.

Bileşen Açıklama
Yüzey Kontrolü SurfaceControl'ü sarar ve bir uygulamanın ekrandaki katmanlara karşılık gelen SurfaceControls oluşturmasını sağlar.

ANativeWindow'un alt öğesi olarak veya başka bir ASurfaceControl'ün alt öğesi olarak oluşturulabilir.
ASYüzeyİşlem İstemcinin bir katmanın geometri gibi tanımlayıcı özelliklerini düzenlemesini sağlamak için İşlemi Sarar ve güncellenmiş arabellekleri SurfaceFlinger'a gönderir.
ASYüzeyİşlemİstatistikleri Kilitlenme süresi, edinme süreleri ve önceki sürüm çerçevesi gibi sunulan işlemlerle ilgili bilgileri önceden kayıtlı bir geri arama aracılığıyla bir uygulamaya gönderir.

Uygulamalar herhangi bir zamanda arabellek gönderebilse de, SurfaceFlinger yalnızca cihaza bağlı olarak değişebilen ekran yenilemeleri arasındaki arabellekleri kabul etmek için uyanır. Bu, bellek kullanımını en aza indirir ve ekran yenilemenin ortasında güncellenirken meydana gelebilecek, ekranda gözle görülür yırtılmayı önler.

Ekran yenileme arasında olduğunda, ekran SurfaceFlinger için VSYNC sinyal gönderir. VSYNC sinyali, ekranın yırtılmadan yenilenebileceğini gösterir. SurfaceFlinger, VSYNC sinyalini aldığında, SurfaceFlinger yeni arabellekler arayan katmanlar listesinde gezinir. SurfaceFlinger yeni bir arabellek bulursa, SurfaceFlinger arabelleği alır; değilse, SurfaceFlinger önceden edinilen arabelleği kullanmaya devam eder. SurfaceFlinger her zaman bir şey göstermelidir, bu nedenle bir arabellekte asılı kalır. Bir katmanda hiç arabellek gönderilmemişse, katman yok sayılır.

SurfaceFlinger, görünür katmanlar için tüm arabellekleri topladıktan sonra, Donanım Oluşturucusuna (HWC) kompozisyonun nasıl gerçekleştirilmesi gerektiğini sorar. HWC, katman bileşimi türünü istemci bileşimi olarak işaretlerse, SurfaceFlinger bu katmanları birleştirir. Daha sonra, SurfaceFlinger'a çıkış tamponu geçer resirkülasyonlu .

Pencere Yöneticisi

WindowManager kontrol penceresi için bir kap nesneleri görünüşüdür nesne. Pencere nesneleri her zaman yüzey nesneleri tarafından desteklenir. WindowManager, bir pencerenin yaşam döngülerini, giriş ve odak olaylarını, ekran yönlendirmesini, geçişleri, animasyonları, konumu, dönüşümleri, z sırasını ve bir pencerenin diğer birçok yönünü denetler. WindowManager, tüm pencere meta verilerini SurfaceFlinger'a gönderir, böylece SurfaceFlinger bu verileri ekrandaki kompozit yüzeylerde kullanabilir.

Ön rotasyon

Çoğu donanım kaplaması döndürmeyi desteklemez (ve destekleseler bile işlem gücüne mal olur); çözüm, arabelleği SurfaceFlinger'a ulaşmadan dönüştürmektir. Robot destekleyen bir sorgu ipucu ( NATIVE_WINDOW_TRANSFORM_HINT olarak) ANativeWindow büyük olasılıkla SurfaceFlinger ile tampon uygulanacak dönüşümü temsil etmek. GL sürücüleri, arabelleği SurfaceFlinger'a ulaşmadan önce dönüştürmek için bu ipucunu kullanabilir, böylece arabellek geldiğinde doğru şekilde dönüştürülür.

Örneğin, 90 derece döndürmek için bir ipucu alırken, sayfanın sonundan kaçmasını önlemek için arabelleğe bir matris oluşturun ve uygulayın. Güçten tasarruf etmek için bu ön dönüşü yapın. Ayrıntılı bilgi için bkz ANativeWindow tanımlanan bir arayüz system/core/include/system/window.h .