VSYNC

Sinyal VSYNC menyinkronkan pipa tampilan. Alur tampilan terdiri dari rendering aplikasi, komposisi SurfaceFlinger, dan Komposer Perangkat Keras (HWC) yang menyajikan gambar di layar. VSYNC menyinkronkan waktu bangun aplikasi untuk memulai rendering, waktu SurfaceFlinger bangun untuk menggabungkan layar, dan siklus penyegaran tampilan. Sinkronisasi ini menghilangkan kegagapan dan meningkatkan kinerja visual grafis.

HWC menghasilkan peristiwa VSYNC dan mengirimkan peristiwa tersebut ke SurfaceFlinger melalui panggilan balik:

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

Perimbangan VSYNC

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

Sinkronisasi dengan VSYNC menghasilkan latensi yang konsisten. Ini mengurangi kesalahan dalam aplikasi dan SurfaceFlinger serta meminimalkan tampilan yang keluar masuk fase satu sama lain. Hal ini mengasumsikan waktu per frame aplikasi dan SurfaceFlinger tidak terlalu bervariasi. Latensinya setidaknya dua frame.

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

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

  • HW_VSYNC_0 — Tampilan mulai menampilkan frame 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 kejadian VSYNC berbasis perangkat keras secara periodik pada tampilan dan menggunakan model tersebut untuk mengeksekusi callback pada offset fase tertentu dari kejadian VSYNC perangkat keras.

DispSync adalah loop penguncian fase perangkat lunak (PLL) yang menghasilkan sinyal VSYNC dan SF_VSYNC yang digunakan oleh Choreographer dan SurfaceFlinger, meskipun tidak diimbangi dari VSYNC perangkat keras.

Aliran DispSync

Gambar 1. Alur DispSync

DispSync memiliki kualitas berikut:

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

VSYNC/pensiun offset

Stempel waktu sinyal pagar pensiun harus cocok dengan HW VSYNC, bahkan pada perangkat yang tidak menggunakan fase offset. Jika tidak, kesalahan akan tampak lebih parah daripada yang sebenarnya. Panel pintar sering kali memiliki delta di mana pagar pensiun adalah ujung dari akses memori langsung (DMA) untuk menampilkan memori, namun saklar tampilan sebenarnya dan HW VSYNC terjadi beberapa waktu kemudian.

PRESENT_TIME_OFFSET_FROM_VSYNC_NS diatur dalam makefile BoardConfig.mk perangkat. Ini didasarkan pada pengontrol tampilan dan karakteristik panel. Waktu dari stempel waktu penghentian pagar hingga 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 Chrome yang menggulir halaman web yang berisi animasi. Offset ini memungkinkan waktu render aplikasi yang lama dan waktu komposisi GPU yang lama.

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