VSYNC

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

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.