SurfaceFlinger ve WindowManager

SurfaceFlinger, arabellekleri kabul eder, oluşturur ve ekrana gönderir. WindowManager, SurfaceFlinger'a arabellekler ve pencere sağlar meta verileri kullanır.

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'dur. Bir uygulama ön plana çıktığında, WindowManager'ı tıklayın. 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. Pencere Yöneticisi daha sonra yüzeyi uygulamaya gönderir, ancak SurfaceControl'i Uygulamanın ekrandaki görünümünü manipüle etmek.

Android 10, ASurfaceControl'i ekledi. tamponları kabul etmesini sağlar. ASurfaceControl, bir yüzeyi ve SurfaceControl'ı SurfaceFlinger'a gönderilen tek bir işlem paketinde birleştirir. ASurfaceControl, bir katmanla ilişkilendirilmiş ve ASurfaceTransaction üzerinden güncelleyebilirsiniz. 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'i sarmalar ve uygulamanın ekrandaki katmanlara karşılık gelir.

Şu kullanıcının alt öğesi olarak oluşturulabilir: ANativeWindow veya başka bir ASurfaceControl'in alt öğesi olarak kullanılır.
İşlem İşlemi İ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.
İşlem İstatistikleri Ö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) uygulamaya gönderir.

Uygulamalar istedikleri zaman arabellek gönderebilir ancak 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, SurfaceFlinger yeni tamponlar aramak için katman listesinde geziniyor. 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, görünüm nesnelerinin kapsayıcısı olan window nesnelerini kontrol eder. Pencere nesneleri her zaman yüzey nesneleriyle desteklenir. WindowManager yaşam döngülerini, girişi ve odağı denetler etkinlikler, ekran yönü, geçişler, animasyonlar, konum, dönüştürmeler, bir pencerenin z sırası ve diğer birçok unsurunu kapsar. WindowManager, tüm pencere meta verilerini SurfaceFlinger'a gönderir. Böylece SurfaceFlinger, bu verileri ekrandaki yüzeyleri birleştirmek için kullanabilir.

Ön rotasyon

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ılı bilgi için ANativeWindow inceleyin. arayüzü system/core/include/system/window.h adresinde tanımlanmıştır.