Sinyal VSYNC menyinkronkan pipeline tampilan. Layar pipeline terdiri dari rendering aplikasi, komposisi SurfaceFlinger, dan Hardware Composer (HWC) yang menampilkan gambar di layar. VSYNC menyinkronkan waktu aplikasi bangun untuk memulai rendering, yaitu waktu ketika SurfaceFlinger bangun untuk menggabungkan layar, dan siklus pembaruan tampilan. Sinkronisasi ini menghilangkan ketersendatan dan meningkatkan kinerja visual grafis.
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
untuk menghasilkan peristiwa VSYNC sehingga dapat disinkronkan dengan
siklus pembaruan tampilan. Saat SurfaceFlinger disinkronkan ke
siklus refresh tampilan, SurfaceFlinger menonaktifkan setVsyncEnabled
untuk
menghentikan HWC agar tidak menghasilkan peristiwa VSYNC. Jika SurfaceFlinger mendeteksi
perbedaan antara VSYNC yang sebenarnya dan VSYNC yang dibuat sebelumnya
SurfaceFlinger mengaktifkan kembali pembuatan peristiwa VSYNC.
Offset VSYNC
Aplikasi sinkronisasi dan loop render SurfaceFlinger ke VSYNC perangkat keras. Pada peristiwa VSYNC, layar mulai menampilkan frame N saat SurfaceFlinger mulai mengomposisikan jendela untuk frame N+1. Aplikasi menangani yang tertunda dan menghasilkan frame N+2.
Menyinkronkan dengan VSYNC memberikan latensi yang konsisten. Mengurangi kesalahan dalam aplikasi dan SurfaceFlinger serta meminimalkan layar yang masuk dan keluar dari fase dengan sama lain. Hal ini mengasumsikan aplikasi dan SurfaceFlinger per frame tidak terlalu bervariasi. Latensi setidaknya dua frame.
Untuk mengatasi hal ini, Anda dapat menggunakan offset VSYNC untuk mengurangi input-ke-tampilan latensi dengan membuat sinyal aplikasi dan komposisi relatif terhadap hardware VSYNC. Hal ini memungkinkan karena aplikasi plus komposisi biasanya memerlukan waktu lebih sedikit dari 33 md.
Hasil offset VSYNC adalah tiga sinyal dengan periode dan offset yang sama fase:
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 VSYNC offset, SurfaceFlinger menerima buffer dan menggabungkan saat aplikasi memproses input dan merender secara bersamaan {i>frame<i}.
Sinkronisasi
DispSync mempertahankan model peristiwa VSYNC berbasis hardware berkala dari dan menggunakan model tersebut untuk mengeksekusi callback pada fase tertentu offset dari peristiwa VSYNC hardware.
DispSync adalah loop kunci fase (PLL) perangkat lunak yang menghasilkan Sinyal VSYNC dan SF_VSYNC yang digunakan oleh Choreographer dan SurfaceFlinger, meskipun bukan offset dari VSYNC perangkat keras.
![Alur DispSync](https://source.android.com/static/docs/core/graphics/images/dispsync.png?authuser=1&hl=id)
Gambar 1. Alur DispSync
DispSync memiliki kualitas berikut:
- Referensi — HW_VSYNC_0.
- Output — VSYNC dan SF_VSYNC.
- Masukan — Hentikan stempel waktu sinyal fence dari Hardware Composer.
VSYNC/menghentikan offset
Stempel waktu sinyal fence pensiun harus cocok dengan HW VSYNC, bahkan pada perangkat yang tidak menggunakan fase offset. Jika tidak, error akan tampak lebih parah daripada aslinya. Panel pintar sering kali memiliki delta dengan pagar pensiun sebagai ujungnya akses memori langsung (DMA) untuk menampilkan memori, tetapi tombol akses dan HW VSYNC adalah beberapa waktu kemudian.
PRESENT_TIME_OFFSET_FROM_VSYNC_NS
disetel di
Makefile BoardConfig.mk
. Ini didasarkan pada pengontrol layar dan panel
karakteristik. Waktu dari stempel waktu penghentian fence ke HW VSYNC
sinyal diukur dalam nanodetik.
Offset VSYNC dan SF_VSYNC
VSYNC_EVENT_PHASE_OFFSET_NS
dan
SF_VSYNC_EVENT_PHASE_OFFSET_NS
disetel secara konservatif berdasarkan
kasus penggunaan dengan muatan tinggi, seperti komposisi GPU parsial selama transisi jendela
atau Chrome yang men-scroll halaman web
yang berisi animasi. Offset ini
memungkinkan waktu render aplikasi yang lama dan waktu komposisi GPU yang lama.
Latensi lebih dari satu milidetik atau dua milidetik sudah terlihat. Untuk meminimalkan latensi tanpa meningkatkan jumlah error secara signifikan, mengintegrasikan error otomatis menyeluruh pengujian.