Sinyal VSYNC menyinkronkan pipeline tampilan. Pipeline layar terdiri dari rendering aplikasi, komposisi SurfaceFlinger, dan Hardware Composer (HWC) yang menampilkan gambar di layar. VSYNC menyinkronkan waktu aplikasi aktif untuk memulai rendering, waktu SurfaceFlinger aktif untuk menggabungkan layar, dan siklus refresh tampilan. Sinkronisasi ini menghilangkan gangguan dan meningkatkan performa visual grafik.
HWC menghasilkan peristiwa VSYNC dan mengirimkan peristiwa ke SurfaceFlinger melalui callback:
typedef void (*HWC2_PFN_VSYNC)(hwc2_callback_data_t callbackData, hwc2_display_t display, int64_t timestamp);
SurfaceFlinger mengontrol apakah HWC menghasilkan peristiwa VSYNC atau tidak dengan
memanggil setVsyncEnabled
. SurfaceFlinger memungkinkan
setVsyncEnabled
menghasilkan peristiwa VSYNC sehingga dapat disinkronkan dengan
siklus refresh layar. Saat SurfaceFlinger disinkronkan dengan
siklus refresh layar, SurfaceFlinger akan menonaktifkan setVsyncEnabled
untuk
menghentikan HWC agar tidak menghasilkan peristiwa VSYNC. Jika SurfaceFlinger mendeteksi
perbedaan antara VSYNC yang sebenarnya dan VSYNC yang sebelumnya ditetapkan,
SurfaceFlinger akan mengaktifkan kembali pembuatan peristiwa VSYNC.
Offset VSYNC
Aplikasi sinkronisasi dan SurfaceFlinger merender loop ke VSYNC hardware. Pada peristiwa VSYNC, layar mulai menampilkan frame N saat SurfaceFlinger mulai mengomposisi jendela untuk frame N+1. Aplikasi menangani input yang tertunda dan menghasilkan frame N+2.
Menyinkronkan dengan VSYNC akan menghasilkan latensi yang konsisten. Hal ini mengurangi error dalam aplikasi dan SurfaceFlinger serta meminimalkan tampilan yang menyimpang dan tidak sinkron satu sama lain. Hal ini mengasumsikan bahwa waktu per frame aplikasi dan SurfaceFlinger tidak terlalu bervariasi. Latensinya minimal dua frame.
Untuk mengatasi hal ini, Anda dapat menggunakan offset VSYNC untuk mengurangi latensi input-to-display dengan membuat sinyal aplikasi dan komposisi relatif terhadap VSYNC hardware. Hal ini dimungkinkan karena komposisi aplikasi plus biasanya memerlukan waktu kurang dari 33 milidetik.
Hasil offset VSYNC adalah tiga sinyal dengan periode dan fase offset yang sama:
HW_VSYNC_0
— Layar mulai menampilkan frame berikutnya.VSYNC
— Aplikasi membaca input dan menghasilkan frame berikutnya.SF_VSYNC
— SurfaceFlinger mulai melakukan komposisi untuk frame berikutnya.
Dengan offset VSYNC, SurfaceFlinger menerima buffer dan menggabungkan frame saat aplikasi secara bersamaan memproses input dan merender frame.
DispSync
DispSync mempertahankan model peristiwa VSYNC berbasis hardware berkala dari layar dan menggunakan model tersebut untuk mengeksekusi callback pada offset fase tertentu dari peristiwa VSYNC hardware.
DispSync adalah loop penguncian fase (PLL) software yang menghasilkan sinyal VSYNC dan SF_VSYNC yang digunakan oleh Choreographer dan SurfaceFlinger, meskipun tidak diimbangi dari VSYNC hardware.

Gambar 1. Alur DispSync
DispSync memiliki kualitas berikut:
- Referensi — HW_VSYNC_0.
- Output — VSYNC dan SF_VSYNC.
- Masukan — Menghentikan stempel waktu sinyal pagar dari Hardware Composer.
VSYNC/offset penghentian
Stempel waktu sinyal pagar penghentian harus cocok dengan VSYNC HW, bahkan di perangkat yang tidak menggunakan fase offset. Jika tidak, error akan tampak lebih parah dari yang sebenarnya. Panel smart sering kali memiliki delta dengan pagar penghentian adalah akhir akses memori langsung (DMA) untuk menampilkan memori, tetapi tombol tampilan yang sebenarnya dan HW VSYNC akan muncul beberapa saat kemudian.
PRESENT_TIME_OFFSET_FROM_VSYNC_NS
ditetapkan dalam makefile
BoardConfig.mk
perangkat. Hal ini didasarkan pada karakteristik pengontrol tampilan dan panel. Waktu dari stempel waktu fence pensiun ke sinyal VSYNC
HW diukur dalam nanodetik.
Offset VSYNC dan SF_VSYNC
VSYNC_EVENT_PHASE_OFFSET_NS
dan
SF_VSYNC_EVENT_PHASE_OFFSET_NS
ditetapkan secara konservatif berdasarkan
kasus penggunaan beban tinggi, seperti komposisi GPU parsial selama transisi jendela
atau Chrome men-scroll halaman web yang berisi animasi. Offset ini
memungkinkan waktu rendering aplikasi yang lama dan waktu komposisi GPU yang lama.
Latensi lebih dari satu atau dua milidetik akan terlihat. Untuk meminimalkan latensi tanpa meningkatkan jumlah error secara signifikan, integrasikan pengujian error otomatis yang menyeluruh.