Sinyal VSync menyinkronkan pipeline tampilan. Pipeline tampilan terdiri dari rendering aplikasi, komposisi SurfaceFlinger, dan Hardware Composer (HWC) yang menampilkan gambar di layar. VSync menyinkronkan waktu aplikasi aktif untuk mulai merender, waktu SurfaceFlinger aktif untuk menggabungkan layar, dan siklus pemuatan ulang tampilan. Sinkronisasi ini menghilangkan stutter dan meningkatkan performa visual grafis.
HWC menghasilkan peristiwa VSync dan mengirimkan peristiwa tersebut 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
membuat peristiwa VSync sehingga dapat disinkronkan dengan
siklus refresh layar. Saat disinkronkan dengan siklus penggantian frame layar, SurfaceFlinger akan menonaktifkan setVsyncEnabled
untuk menghentikan HWC membuat peristiwa VSync. Jika SurfaceFlinger mendeteksi
perbedaan antara VSync sebenarnya dan VSync yang sebelumnya ditetapkan, SurfaceFlinger akan mengaktifkan kembali pembuatan peristiwa VSync.
Offset VSync
Aplikasi sinkronisasi dan loop rendering SurfaceFlinger ke VSync hardware. Pada peristiwa VSync, layar mulai menampilkan frame N sementara SurfaceFlinger mulai menyusun jendela untuk frame N+1. Aplikasi menangani input yang tertunda dan menghasilkan frame N+2.
Menyinkronkan dengan VSync memberikan latensi yang konsisten. Hal ini mengurangi error di aplikasi dan SurfaceFlinger serta meminimalkan tampilan yang bergeser dan tidak sinkron satu sama lain. Hal ini mengasumsikan waktu per frame aplikasi dan SurfaceFlinger tidak bervariasi secara signifikan. Latensinya minimal dua frame.
Untuk mengatasi hal ini, Anda dapat menggunakan offset VSync untuk mengurangi latensi input-ke-tampilan dengan membuat sinyal aplikasi dan komposisi relatif terhadap VSync hardware. Hal ini dimungkinkan karena komposisi plus aplikasi biasanya memerlukan waktu kurang dari 33 md.
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 komposit 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 periodik dari layar dan menggunakan model tersebut untuk mengeksekusi callback pada offset fase tertentu dari peristiwa VSync hardware.
DispSync adalah software phase-lock loop (PLL) yang menghasilkan sinyal
VSYNC
dan SF_VSYNC
yang digunakan oleh Choreographer dan SurfaceFlinger,
meskipun tidak diimbangi dari VSync hardware.
Alur DispSync diilustrasikan dalam gambar berikut:

Gambar 1. Alur DispSync.
DispSync memiliki kualitas berikut:
- Referensi —
HW_VSYNC_0
. - Output —
VSYNC
danSF_VSYNC
. - Feedback — Menghentikan penggunaan stempel waktu sinyal geofence dari HWC.
Offset pelepasan VSync
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 daripada yang sebenarnya. Panel smart sering kali memiliki delta saat batas penonaktifan adalah akhir dari akses memori langsung (DMA) ke memori tampilan, tetapi peralihan tampilan dan VSync HW yang sebenarnya terjadi beberapa saat kemudian.
PRESENT_TIME_OFFSET_FROM_VSYNC_NS
ditetapkan dalam makefile
BoardConfig.mk
perangkat. Hal ini didasarkan pada karakteristik pengontrol dan panel layar. Waktu dari stempel waktu fence penghentian hingga 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 yang 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 terasa. Untuk meminimalkan latensi tanpa meningkatkan jumlah error secara signifikan, integrasikan pengujian error otomatis yang menyeluruh.