SurfaceFlinger ve WindowManager

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

SurfaceFlinger

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

SurfaceFlinger'ın arabellekleri kabul etme yöntemlerinden biri BufferQueue ve SurfaceControl'dur. Bir uygulama ön plana geldiğinde WindowManager kaynağından arabellek ister. WindowManager, SurfaceFlinger'dan bir katman ister. Katman, BufferQueue'yu içeren bir yüzey ile ekran çerçevesi gibi katman meta verilerini içeren bir SurfaceControl örneğinin birleşimidir. SurfaceFlinger, katmanı oluşturur ve WindowManager'ya gönderir. WindowManager ardından yüzeyi uygulamaya gönderir ancak SurfaceControl örneğini, uygulamanın ekrandaki görünümünü değiştirmek için saklar.

Android 10'da, SurfaceFlinger'ın arabellekleri kabul etmesinin bir başka yolu olan ASurfaceControl eklendi. ASurfaceControl, bir yüzeyi ve bir 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şkilendirilir. Uygulamalar daha sonra, kilitlenme zamanı ve edinme zamanları gibi bilgileri içeren ASurfaceTransactionStats parametrelerini ileten geri çağırmalar aracılığıyla ASurfaceTransaction örnekleri hakkında bilgi alır.

Aşağıdaki tabloda ASurfaceControl ve ilişkili bileşenleri hakkında daha fazla bilgi verilmektedir:

Bileşen Açıklama
ASurfaceControl Wraps SurfaceControl ve bir uygulamanın, ekrandaki katmanlara karşılık gelen SurfaceControl örnekleri oluşturmasını sağlar.

ANativeWindow öğesinin veya başka bir ASurfaceControl örneğinin alt öğesi olarak oluşturulabilir.
ASurfaceTransaction İstemcinin bir katmanın açıklayıcı özelliklerini (ör. geometri) düzenlemesini sağlamak için Transaction sarmalar ve güncellenen arabellekleri SurfaceFlinger'a gönderir.
ASurfaceTransactionStats Sunulan işlemlerle ilgili bilgileri (ör. kilitlenme süresi, edinme süreleri ve önceki yayınlanma sınırı) önceden kaydedilmiş bir geri çağırma yoluyla uygulamaya gönderir.

Uygulamalar arabellekleri istedikleri zaman gönderebilse de SurfaceFlinger yalnızca ekran yenilemeleri arasında arabellekleri kabul etmek için uyanır. Bu süre cihaza bağlı olarak değişebilir. Bu, bellek kullanımını en aza indirir ve ekran yenileme ortasında ekran güncellenirken oluşabilecek görünür yırtılmaları önler.

Ekran yenilenmeler arasında olduğunda ekran, VSync sinyalini SurfaceFlinger'a gönderir. VSync sinyali, ekranın yırtılma olmadan yenilenebileceğini gösterir. SurfaceFlinger, VSync sinyalini aldığında yeni arabellekler aramak için katman listesini tarar. SurfaceFlinger yeni bir arabellek bulursa arabelleği alır, bulamazsa daha önce alınan arabelleği kullanmaya devam eder. SurfaceFlinger her zaman bir şeyler göstermelidir. Bu nedenle, bir arabelleği tutar. Bir katmanda hiç arabellek gönderilmediyse katman yoksayılır.

SurfaceFlinger, görünür katmanlar için tüm arabellekleri topladıktan sonra Hardware Composer'a (HWC) birleştirmenin nasıl yapılması gerektiğini sorar. HWC, katman bileşimi türünü istemci bileşimi olarak işaretlerse SurfaceFlinger bu katmanları birleştirir. Ardından, SurfaceFlinger çıkış arabelleğini HWC'ye iletir.

WindowManager

WindowManager, Window nesnelerini kontrol eder. Bu nesneler, View nesnelerinin kapsayıcılarıdır. Window nesneler her zaman Surface nesnelerle desteklenir. WindowManager yaşam döngülerini, giriş ve odaklanma etkinliklerini, ekran yönünü, geçişleri, animasyonları, konumu, dönüşümleri, z-sırasını ve bir pencerenin diğer birçok yönünü yönetir. WindowManager, pencere meta verilerinin tamamını SurfaceFlinger'a gönderir. Böylece SurfaceFlinger, bu verileri kullanarak ekrandaki yüzeyleri birleştirebilir.

Rotasyon öncesi

Birçok donanım katmanı döndürmeyi desteklemez (desteklese bile işlem gücü gerekir). Çözüm, arabellek SurfaceFlinger'a ulaşmadan önce dönüştürmektir. Android, SurfaceFlinger tarafından arabelleğe uygulanacak en olası dönüşümü temsil etmek için ANativeWindow içinde bir sorgu ipucunu (NATIVE_WINDOW_TRANSFORM_HINT) destekler. GL sürücüleri, arabellek SurfaceFlinger'a ulaşmadan önce önceden dönüştürmek için bu ipucunu kullanabilir. 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 arabelleğin sayfanın sonuna ulaşmasını önlemek için bir matris oluşturup arabelleğe uygulayın. Güç tasarrufu için bu işlemi döndürme öncesinde yapın. Ayrıntılar için ANativeWindow arayüzünün system/core/include/system/window.h içinde tanımlandığı bölüme bakın.