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 veSurfaceControl veya ASurfaceControl aracılığıyla.
SurfaceFlinger'ın arabellekleri kabul etmesinin bir yolu, BufferQueue veSurfaceControl üzerindendir. Bir uygulama ön plana geldiğinde WindowManager'dan arabelleğe alma işlemi ister. WindowManager daha sonra 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'ü sarmalayarak 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. |
İş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. |
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 istedikleri zaman arabellek gönderebilir ancak SurfaceFlinger yalnızca ekran yenilemeleri arasındaki arabellekleri kabul etmek için uyanır. Bu süre cihaza göre değişiklik gösterebilir. Bu, bellek kullanımını en aza indirir ve yenileme ortasında ekran güncellenirken meydana gelebilecek, ekranda görünür yırtılmayı ö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 tampon bulursa tamponu alır. Aksi takdirde SurfaceFlinger daha önce alınan arabelleği kullanmaya devam eder. SurfaceFlinger'ın her zaman bir şey görüntülemesi gerekir, bu nedenle bir arabelleğe takılı kalır. Daha önce bir katmanda hiç tampon gönderilmediyse katman yok sayı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 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, view nesnelerinin kapsayıcısı olan window nesnelerini kontrol eder. Pencere nesneleri her zaman yüzey nesneleriyle desteklenir. WindowManager yaşam döngülerini, giriş ve odaklama etkinliklerini, ekran yönünü, geçişleri, animasyonları, konumlandırmayı, dönüştürmeleri, z sırasını ve pencerenin diğer birçok özelliğini denetler. 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, arabelleği SurfaceFlinger'a ulaşmadan önce önceden dönüştürmek için bu ipucunu kullanabilir. Böylece arabellek ulaştığında, doğru şekilde dönüştürülür.
Ö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.