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'dur. Bir uygulama ön plana geldiğinde WindowManager'dan arabellek ister. Ardından WindowManager, SurfaceFlinger'dan bir katman ister. Katman, BufferQueue'ı içeren bir yüzey ile ekran ç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 ekrandaki uygulamanın görünümünü değiştirmek için SurfaceControl'i tutar.

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

ASurfaceControl ve ilişkili bileşenleri hakkında daha fazla bilgiyi aşağıdaki tabloda bulabilirsiniz.

Bileşen Açıklama
ASurfaceControl SurfaceControl'ü sarar ve uygulamaların ekrandaki katmanlara karşılık gelen SurfaceControl'ler oluşturmasını sağlar.

ANativeWindow'un veya başka bir ASurfaceControl'ün alt öğesi olarak oluşturulabilir.
ASurfaceTransaction İstemcinin bir katmanın geometri gibi açıklayıcı özelliklerini düzenlemesini sağlamak için işlemi 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. Pencere nesneleri her zaman yüzey nesneleriyle desteklenir. WindowManager, yaşam döngüleri, giriş ve odak etkinlikleri, ekran yönü, geçişler, animasyonlar, konum, dönüştürme işlemleri, z-sıralı 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, bu verileri ekrandaki yüzeyleri birleştirmek için 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 ön rotasyonu 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.