Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.
Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

VSYNC

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

HWC menghasilkan peristiwa VSYNC dan mengirim 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 ke setVsyncEnabled . SurfaceFlinger memungkinkan 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 membuat peristiwa VSYNC. Jika SurfaceFlinger mendeteksi perbedaan antara VSYNC aktual dan VSYNC, maka SurfaceFlinger sebelumnya akan mengaktifkan kembali pembuatan acara VSYNC.

Offset VSYNC

Aplikasi sinkronisasi dan render SurfaceFlinger melakukan loop ke perangkat keras VSYNC. 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 bingkai N + 2 .

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

Untuk mengatasinya, Anda dapat menggunakan VSYNC offset untuk mengurangi latensi input-to-display dengan membuat sinyal komposisi dan aplikasi relatif terhadap VSYNC hardware. Ini dimungkinkan karena komposisi aplikasi plus biasanya membutuhkan waktu kurang dari 33 md.

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

  • HW_VSYNC_0 - Tampilan mulai menampilkan bingkai berikutnya.
  • VSYNC - Aplikasi membaca masukan dan menghasilkan bingkai berikutnya.
  • SF_VSYNC - SurfaceFlinger mulai menyusun untuk bingkai berikutnya.

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

DispSync

DispSync memelihara model peristiwa VSYNC berbasis perangkat keras berkala dari sebuah tampilan dan menggunakan model tersebut untuk mengeksekusi callback pada offset fase tertentu dari peristiwa VSYNC perangkat keras.

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

Alur DispSync

Gambar 1. Alur DispSync

DispSync memiliki kualitas berikut:

  • Referensi - HW_VSYNC_0.
  • Output - VSYNC dan SF_VSYNC.
  • Umpan Balik - Hentikan stempel waktu sinyal pagar dari Hardware Composer.

VSYNC / Pensiun offset

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

PRESENT_TIME_OFFSET_FROM_VSYNC_NS disetel di makefile BoardConfig.mk perangkat. Ini didasarkan pada pengontrol tampilan dan karakteristik panel. Waktu dari stempel waktu pagar pensiunan ke sinyal HW VSYNC diukur dalam nanodetik.

VSYNC dan SF_VSYNC offset

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 laman 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 thorogh.