SurfaceFlinger ve WindowManager

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

SurfaceFlinger

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

SurfaceFlinger'ın arabellekleri kabul etmesinin bir yolu BufferQueue ve SurfaceControl'dür. Bir uygulama ön plana çıktığında WindowManager'dan arabellek ister. WindowManager daha sonra SurfaceFlinger'dan bir katman ister. Katman, BufferQueue'yu içeren bir yüzey ile görüntüleme çerçevesi gibi katman meta verilerini içeren bir SurfaceControl'ün birleşimidir. 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'ü korur.

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

Aşağıdaki tabloda ASurfaceControl ve ilgili bileşenleri hakkında daha fazla ayrıntı yer almaktadır.

Bileşen Tanım
ASurfaceControl 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.
ASurfaceTransaction İstemcinin bir katmanın geometri gibi tanımlayıcı özelliklerini düzenlemesini sağlamak için İşlemi sarar ve güncellenen arabellekleri SurfaceFlinger'a gönderir.
ASurfaceTransactionStats Kilitleme süresi, edinme süreleri ve önceki sürüm aralığı gibi sunulan işlemlerle ilgili bilgileri, önceden kayıtlı bir geri arama yoluyla bir uygulamaya gönderir.

Uygulamalar herhangi bir zamanda arabellek gönderebilse de, SurfaceFlinger yalnızca ekran yenilemeleri arasında arabellekleri kabul etmek için uyanır ve bu, cihaza bağlı olarak farklılık gösterebilir. Bu, bellek kullanımını en aza indirir ve yenileme sırasında ekran güncellenirken ekranda meydana gelebilecek gözle görülür yırtılmaları önler.

Ekran yenilemeler arasındayken ekran VSYNC sinyalini SurfaceFlinger'a gönderir. VSYNC sinyali ekranın yırtılmadan yenilenebileceğini gösterir. SurfaceFlinger, VSYNC sinyalini aldığında SurfaceFlinger, yeni arabellekler bulmak için katmanlar listesinde gezinir. SurfaceFlinger yeni bir arabellek bulursa SurfaceFlinger arabelleği alır; değilse SurfaceFlinger önceden edinilen arabelleği kullanmaya devam eder. SurfaceFlinger'ın her zaman bir şeyler görüntülemesi gerekir, bu nedenle tek bir ara belleğe takılı kalır. Bir katmana hiç arabellek gönderilmemişse katman yoksayılır.

SurfaceFlinger görünür katmanlar için tüm arabellekleri topladıktan sonra Hardware Composer'a (HWC) kompozisyonun nasıl gerçekleştirilmesi gerektiğini sorar. HWC katman kompozisyonu türünü istemci kompozisyonu olarak işaretlerse SurfaceFlinger bu katmanları birleştirir. Daha sonra SurfaceFlinger, çıktı arabelleğini HWC'ye iletir.

Pencere Yöneticisi

WindowManager, görünüm nesneleri için kapsayıcılar olan pencere nesnelerini kontrol eder. 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 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 katmanı rotasyonu desteklemez (ve destekleseler bile işlem gücüne mal olur); çözüm, tamponu SurfaceFlinger'a ulaşmadan önce dönüştürmektir. Android, SurfaceFlinger tarafından ara belleğe uygulanacak en olası dönüşümü temsil etmek için ANativeWindow bir sorgu ipucunu ( NATIVE_WINDOW_TRANSFORM_HINT ) destekler. GL sürücüleri bu ipucunu arabelleği SurfaceFlinger'a ulaşmadan önce dönüştürmek için 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 aldığınızda, sayfanın sonuna doğru akmasını önlemek için ara belleğe bir matris oluşturun ve uygulayın. Güçten tasarruf etmek için bu ön döndürmeyi yapın. Ayrıntılar için system/core/include/system/window.h dosyasında tanımlanan ANativeWindow arayüzüne bakın.