VSYNC

Sinyal VSYNC menyinkronkan pipa tampilan. Pipeline tampilan terdiri dari rendering aplikasi, komposisi SurfaceFlinger, dan Hardware Composer (HWC) yang menampilkan gambar di layar. VSYNC menyinkronkan waktu aplikasi bangun untuk memulai rendering, waktu SurfaceFlinger bangun untuk menggabungkan layar, dan siklus penyegaran tampilan. Sinkronisasi ini menghilangkan stutter dan meningkatkan kinerja visual grafis.

HWC menghasilkan event VSYNC dan mengirimkan event 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 penyegaran tampilan. Saat SurfaceFlinger disinkronkan ke siklus penyegaran tampilan, SurfaceFlinger menonaktifkan setVsyncEnabled untuk menghentikan HWC menghasilkan peristiwa VSYNC. Jika SurfaceFlinger mendeteksi perbedaan antara VSYNC aktual dan VSYNC, SurfaceFlinger yang dibuat sebelumnya akan mengaktifkan kembali pembuatan peristiwa VSYNC.

offset VSYNC

Aplikasi sinkronisasi dan SurfaceFlinger membuat loop ke perangkat keras VSYNC. Pada acara VSYNC, tampilan mulai menampilkan bingkai N sementara SurfaceFlinger mulai mengomposisi jendela untuk bingkai N+1 . Aplikasi menangani input yang tertunda dan menghasilkan frame N+2 .

Sinkronisasi dengan VSYNC memberikan latensi yang konsisten. Ini mengurangi kesalahan dalam aplikasi dan SurfaceFlinger dan meminimalkan tampilan yang bergeser masuk dan keluar dari fase satu sama lain. Ini mengasumsikan waktu per-frame aplikasi dan SurfaceFlinger tidak terlalu bervariasi. Latensi setidaknya dua frame.

Untuk memperbaikinya, Anda dapat menggunakan offset VSYNC untuk mengurangi latensi input-ke-tampilan dengan membuat sinyal aplikasi dan komposisi relatif terhadap VSYNC perangkat keras. Ini dimungkinkan karena komposisi app plus biasanya membutuhkan waktu kurang dari 33 md.

Hasil offset VSYNC adalah tiga sinyal dengan periode dan fase offset yang sama:

  • HW_VSYNC_0 — Tampilan mulai menampilkan bingkai berikutnya.
  • VSYNC — Aplikasi membaca input dan menghasilkan frame berikutnya.
  • SF_VSYNC — SurfaceFlinger mulai membuat komposisi untuk frame berikutnya.

Dengan offset VSYNC, SurfaceFlinger menerima buffer dan menggabungkan frame sementara aplikasi secara bersamaan memproses input dan merender frame.

Sinkronisasi Tampilan

DispSync memelihara model peristiwa VSYNC berbasis perangkat keras periodik dari tampilan dan menggunakan model itu untuk mengeksekusi panggilan balik pada offset fase tertentu dari peristiwa VSYNC perangkat keras.

DispSync adalah software phase-lock loop (PLL) yang menghasilkan sinyal VSYNC dan SF_VSYNC yang digunakan oleh Koreografer dan SurfaceFlinger, bahkan jika tidak diimbangi dari perangkat keras VSYNC.

Aliran DispSync

Gambar 1. Aliran DispSync

DispSync memiliki kualitas berikut:

  • Referensi — HW_VSYNC_0.
  • Keluaran — VSYNC dan SF_VSYNC.
  • Umpan Balik — Menghentikan stempel waktu sinyal pagar dari Komposer Perangkat Keras.

VSYNC/Pensiun offset

Stempel waktu sinyal pensiunan pagar harus cocok dengan HW VSYNC, bahkan pada perangkat yang tidak menggunakan fase offset. Jika tidak, kesalahan tampak lebih parah daripada sebenarnya. Panel pintar sering memiliki delta di mana pagar pensiun adalah ujung akses memori langsung (DMA) ke memori tampilan, tetapi sakelar tampilan aktual dan HW VSYNC beberapa waktu kemudian.

PRESENT_TIME_OFFSET_FROM_VSYNC_NS diatur di makefile BoardConfig.mk perangkat. Ini didasarkan pada pengontrol tampilan dan karakteristik panel. Waktu dari stempel waktu pagar pensiun ke sinyal HW VSYNC 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 beban tinggi, seperti komposisi GPU parsial selama transisi jendela atau pengguliran Chrome melalui halaman web yang berisi animasi. Offset ini memungkinkan waktu render aplikasi yang lama dan waktu komposisi GPU yang lama.

Lebih dari satu atau dua milidetik latensi terlihat. Untuk meminimalkan latensi tanpa meningkatkan jumlah kesalahan secara signifikan, integrasikan pengujian kesalahan otomatis yang menyeluruh.