SurfaceFlinger arabellekleri kabul eder, arabellekleri oluşturur ve ekrana arabellekleri gönderir. WindowManager, SurfaceFlinger'a yüzeyleri ekrana birleştirmek için SurfaceFlinger'ın 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 etmenin bir yolu BufferQueue ve SurfaceControl'dür. Bir uygulama ön plana geldiğinde, WindowManager'dan tamponlar ister. WindowManager daha sonra SurfaceFlinger'dan bir katman ister. Bir katman, BufferQueue içeren bir yüzey ile ekran çerçevesi gibi katman meta verilerini içeren birSurfaceControl'ün birleşimidir . SurfaceFlinger, katmanı oluşturur ve onu WindowManager'a gönderir. WindowManager daha sonra yüzeyi uygulamaya gönderir, ancak SurfaceControl'ü uygulamanın ekrandaki görünümünü değiştirmek için tutar.
Android 10, SurfaceFlinger'ın arabellekleri kabul edebileceği başka bir yol olan ASurfaceControl'ü ekler. ASurfaceControl, bir yüzeyi ve SurfaceControl'ü SurfaceFlinger'a gönderilen tek bir işlem paketinde birleştirir. Bir ASurfaceControl, uygulamaların ASurfaceTransactions aracılığıyla güncellediği bir katmanla ilişkilendirilir. Uygulamalar daha sonra ASurfaceTransactionStats'i geçme süresi, edinme süreleri gibi bilgileri içeren geri çağırmalar yoluyla ASurfaceTransactions hakkında bilgi alır.
Aşağıdaki tablo, ASurfaceControl ve ilişkili bileşenleri hakkında daha fazla ayrıntı içerir.
|Bileşen||Açıklama|
|ASurfaceControl|| SurfaceControl'ü sarar ve bir uygulamanın ekrandaki katmanlara karşılık gelen SurfaceControl'ler oluşturmasını sağlar.|
ANativeWindow'un alt öğesi veya başka bir ASurfaceControl'ün alt öğesi olarak oluşturulabilir.
|ASurfaceTransaction||İşlemi istemcinin bir katmanın geometri gibi tanımlayıcı özelliklerini düzenlemesini sağlamak için sarar ve güncellenmiş arabellekleri SurfaceFlinger'a gönderir.|
|ASurfaceTransactionStats||Önceden kaydedilmiş bir geri arama aracılığıyla bir uygulamaya mandal süresi, edinme süreleri ve önceki sürüm sınırı gibi sunulan işlemler hakkında bilgi gönderir.|
Uygulamalar herhangi bir zamanda tampon gönderebilse de SurfaceFlinger, cihaza bağlı olarak farklılık gösterebilen ekran yenilemeleri arasında yalnızca arabellekleri kabul etmek için uyanır. Bu, bellek kullanımını en aza indirir ve yenileme ortasında ekranı güncellerken meydana gelebilecek ekranda gözle görülür yırtılmayı ö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 tamponlar arayan katman listesinde gezinir. SurfaceFlinger yeni bir arabellek bulursa, SurfaceFlinger tamponu alır; değilse, SurfaceFlinger önceden edinilmiş tamponu kullanmaya devam eder. SurfaceFlinger her zaman bir şey görüntülemelidir, bu nedenle tek bir arabelleğe takılı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, Hardware Composer'a (HWC) kompozisyonun nasıl gerçekleştirilmesi gerektiğini sorar. HWC, katman oluşturma türünü istemci kompozisyonu olarak işaretlerse, SurfaceFlinger bu katmanları birleştirir. Ardından SurfaceFlinger, çıktı arabelleğini HWC'ye iletir .
WindowManager
WindowManager, görüntüleme nesneleri için kaplar olan pencere nesnelerini kontrol eder. Pencere nesneleri her zaman yüzey nesneleri tarafından desteklenir. WindowManager, yaşam döngülerini, girdi ve odak olaylarını, ekran yönünü, geçişleri, animasyonları, konumu, dönüşümleri, z düzenini 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 bileşik yüzeylerde kullanabilir.
Ön rotasyon
Çoğu donanım katmanı dönüşü desteklemez (ve destekleseler bile, işlem gücüne mal olur); çözüm, SurfaceFlinger'a ulaşmadan önce tamponu 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, bu ipucunu, SurfaceFlinger'a ulaşmadan önce tamponu önceden dönüştürmek için kullanabilir, böylece tampon 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 akması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ılar için
system/core/include/system/window.h içinde tanımlanan
ANativeWindow arayüzüne bakın.