VSYNC sinyali ekran hattını senkronize eder. Ekran ardışık düzeni; uygulama oluşturma, SurfaceFlinger kompozisyonu ve ekrandaki görüntüleri sunan Donanım Oluşturucu'dan (HWC) oluşur. VSYNC, uygulamaların oluşturmaya başlamak için uyanma zamanını, SurfaceFlinger'ın ekranı birleştirmek için uyanma zamanını ve ekran yenileme döngüsünü senkronize eder. Bu senkronizasyon takılmayı ortadan kaldırır ve grafiklerin görsel performansını artırır.
HWC, VSYNC olayları oluşturur ve olayları geri arama yoluyla SurfaceFlinger'a gönderir:
typedef void (*HWC2_PFN_VSYNC)(hwc2_callback_data_t callbackData, hwc2_display_t display, int64_t timestamp);
SurfaceFlinger, HWC'nin setVsyncEnabled
öğesini çağırarak VSYNC olayları oluşturup oluşturmadığını kontrol eder. SurfaceFlinger, setVsyncEnabled
ekranın yenileme döngüsüyle senkronize olabilmesi için VSYNC olayları oluşturmasını sağlar. SurfaceFlinger, ekran yenileme döngüsüyle senkronize edildiğinde, SurfaceFlinger, HWC'nin VSYNC olayları oluşturmasını durdurmak için setVsyncEnabled
devre dışı bırakır. SurfaceFlinger, gerçek VSYNC ile VSYNC arasında bir fark tespit ederse, önceden kurulmuş olan SurfaceFlinger, VSYNC olayı oluşturmayı yeniden etkinleştirir.
VSYNC dengelemesi
Senkronizasyon uygulaması ve SurfaceFlinger, donanım VSYNC'sine döngüler oluşturur. Bir VSYNC olayında, SurfaceFlinger N+1 çerçevesi için pencereleri birleştirmeye başlarken ekran N karesini göstermeye başlar. Uygulama, bekleyen girişi yönetir ve N+2 çerçevesini oluşturur.
VSYNC ile senkronizasyon tutarlı bir gecikme süresi sağlar. Uygulamalardaki ve SurfaceFlinger'daki hataları azaltır ve ekranların birbiriyle aynı faza girip çıkmasını en aza indirir. Bu, uygulama ve SurfaceFlinger'ın kare başına sürelerinin büyük ölçüde değişmediğini varsayar. Gecikme en az iki karedir.
Bunu düzeltmek için uygulama ve kompozisyon sinyalini donanım VSYNC'sine göre yaparak giriş-görüntü gecikmesini azaltmak için VSYNC dengelemelerini kullanabilirsiniz. Uygulama artı kompozisyonun genellikle 33 ms'den az sürmesi nedeniyle bu mümkündür.
VSYNC ofsetinin sonucu aynı periyoda ve ofset fazına sahip üç sinyaldir:
-
HW_VSYNC_0
— Ekran sonraki kareyi göstermeye başlar. -
VSYNC
— Uygulama girişi okur ve sonraki kareyi oluşturur. -
SF_VSYNC
— SurfaceFlinger sonraki kare için birleştirmeye başlar.
VSYNC ofseti ile SurfaceFlinger arabelleği alır ve çerçeveyi birleştirir; bu sırada uygulama aynı anda girişi işler ve çerçeveyi oluşturur.
DispSync
DispSync, bir ekranın periyodik donanım tabanlı VSYNC olaylarının bir modelini korur ve bu modeli, donanım VSYNC olaylarından belirli faz sapmalarında geri aramaları yürütmek için kullanır.
DispSync, donanım VSYNC'sinden dengelenmemiş olsa bile Koreograf ve SurfaceFlinger tarafından kullanılan VSYNC ve SF_VSYNC sinyallerini üreten bir yazılım faz kilitleme döngüsüdür (PLL).
![DispSync akışı](https://source.android.com/static/docs/core/graphics/images/dispsync.png?authuser=6&hl=tr)
Şekil 1. DispSync akışı
DispSync aşağıdaki niteliklere sahiptir:
- Referans — HW_VSYNC_0.
- Çıkış — VSYNC ve SF_VSYNC.
- Geribildirim — Hardware Composer'dan çit sinyali zaman damgalarını kullanımdan kaldırın.
VSYNC/çıkarma ofseti
Kullanımdan kaldırılan çitlerin sinyal zaman damgası, ofset aşamasını kullanmayan cihazlarda bile HW VSYNC ile eşleşmelidir. Aksi takdirde hatalar olduğundan daha ciddi görünür. Akıllı paneller genellikle, kullanımdan kaldırılan çitin, belleği görüntülemek için doğrudan bellek erişiminin (DMA) sonu olduğu bir deltaya sahiptir, ancak gerçek ekran anahtarı ve HW VSYNC bir süre sonradır.
PRESENT_TIME_OFFSET_FROM_VSYNC_NS
, cihazın BoardConfig.mk
make dosyasında ayarlanır. Ekran denetleyicisine ve panel özelliklerine dayanmaktadır. Kullanım dışı çit zaman damgasından HW VSYNC sinyaline kadar geçen süre nanosaniye cinsinden ölçülür.
VSYNC ve SF_VSYNC dengelemeleri
VSYNC_EVENT_PHASE_OFFSET_NS
ve SF_VSYNC_EVENT_PHASE_OFFSET_NS
, pencere geçişi sırasında kısmi GPU bileşimi veya animasyonlar içeren bir web sayfasında Chrome'un kaydırılması gibi yüksek yüklü kullanım durumlarına göre ihtiyatlı bir şekilde ayarlanır. Bu uzaklıklar, uzun uygulama oluşturma süresine ve uzun GPU oluşturma süresine olanak tanır.
Bir veya iki milisaniyeden fazla gecikme fark edilir. Hata sayılarını önemli ölçüde artırmadan gecikmeyi en aza indirmek için kapsamlı otomatik hata testini entegre edin.