Kecepatan frame

Pustaka Android Frame Pacing, juga dikenal sebagai Swappy, adalah bagian dari Android Game SDK . Ini membantu game OpenGL dan Vulkan mencapai rendering yang mulus dan kecepatan frame yang tepat di Android.

Kecepatan bingkai adalah sinkronisasi logika game dan loop rendering dengan subsistem tampilan OS dan perangkat keras tampilan yang mendasarinya. Subsistem tampilan Android dirancang untuk menghindari artefak visual tertentu, seperti robekan. Subsistem tampilan menghindari robekan dengan melakukan hal berikut:

  • Buffer frame sebelumnya secara internal
  • Mendeteksi pengiriman frame yang terlambat
  • Melanjutkan menampilkan frame saat ini ketika frame terlambat terdeteksi

Waktu tampilan bingkai yang tidak konsisten disebabkan oleh loop render game yang berjalan pada kecepatan berbeda dari yang didukung perangkat keras tampilan asli. Masalah muncul ketika render loop game berjalan terlalu lambat untuk perangkat keras tampilan yang mendasarinya, sehingga menyebabkan waktu tampilan tidak konsisten. Misalnya, saat game yang berjalan pada kecepatan 30 fps mencoba melakukan rendering pada perangkat yang secara asli mendukung 60 fps, loop render game tersebut menyebabkan frame berulang tetap berada di layar selama 16 ms tambahan. Jenis pemutusan ini menciptakan inkonsistensi substansial dalam waktu bingkai seperti 33 mdtk, 16 mdtk, 49 mdtk, dan seterusnya. Adegan yang terlalu rumit semakin memperparah masalah ini karena menyebabkan terjadinya frame yang hilang.

Pustaka Frame Pacing melakukan tugas berikut:

  • Mengkompensasi kegagapan karena frame permainan yang pendek.
  • Menggunakan pagar sinkronisasi untuk frame panjang yang menyebabkan kegagapan dan latensi.
    • Suntikan menunggu ke dalam aplikasi. Hal ini memungkinkan saluran tampilan untuk mengejar ketinggalan, daripada membiarkan tekanan balik menumpuk.
    • Menggunakan pagar sinkronisasi ( EGL_KHR_fence_sync dan VkFence ).
  • Memilih kecepatan refresh untuk memberikan fleksibilitas dan presentasi yang lancar, jika perangkat Anda mendukung beberapa kecepatan refresh.
  • Memberikan statistik untuk debugging dan pembuatan profil menggunakan statistik bingkai .

Untuk mempelajari cara mengonfigurasi perpustakaan agar beroperasi dalam mode berbeda sesuai kebutuhan Anda, lihat Mode pengoperasian yang didukung .

Untuk mengimplementasikan menggunakan penyaji OpenGL atau penyaji Vulkan, lihat

Untuk membaca selengkapnya, lihat Mencapai kecepatan bingkai yang tepat .

Intervensi pembatasan frame per detik

Intervensi pembatasan frame per detik (FPS) memungkinkan game berjalan pada FPS yang sesuai hanya dengan menggunakan perubahan sisi platform dan tanpa memerlukan tindakan apa pun dari pihak pengembang.

Implementasi intervensi pelambatan FPS menggunakan komponen-komponen berikut:

Layanan GameManager

Komponen GameManagerService menyimpan semua informasi per pengguna dan per game tentang mode game dan intervensi game. Informasi FPS disimpan di GameManagerService bersama informasi intervensi lainnya, seperti faktor penurunan skala resolusi, dalam pemetaan <PACKAGE_NAME, Interventions> untuk setiap profil pengguna. Informasi FPS diakses ketika mode permainan diubah atau intervensi diperbarui. UID bersifat unik untuk setiap PACKAGE_NAME dan pengguna, dan selanjutnya dapat diterjemahkan ke dalam pasangan <UID, Frame Rate> untuk dikirim ke SurfaceFlinger.

PermukaanFlinger

Komponen SurfaceFlinger sudah mendukung pembatasan FPS suatu aplikasi selama frame rate merupakan pembagi kecepatan refresh tampilan. Jika terjadi vsync, SurfaceFlinger memeriksa validitas vsync untuk aplikasi yang dibatasi dengan memverifikasi apakah stempel waktu vsync berada dalam fase dengan kecepatan bingkai aplikasi. Jika kecepatan bingkai tidak sefasa dengan vsync, maka SurfaceFlinger menahan bingkai hingga kecepatan bingkai dan vsync berada dalam fase.

Gambar berikut menjelaskan interaksi antara GameManagerService dan SurfaceFlinger:

Interaksi antara GameManagerService dan SurfaceFlinger

Gambar 1. Interaksi antara GameServiceManager dan SurfaceFlinger

SurfaceFinger mempertahankan pemetaan pasangan <UID, Frame Rate> untuk menetapkan prioritas pembatasan kecepatan frame baru. UID bersifat unik antara pengguna dan game, sehingga setiap pengguna di satu perangkat dapat memiliki pengaturan frame rate yang berbeda pada game yang sama. Untuk membatasi kecepatan frame game, GameServiceManager memanggil SurfaceFlinger untuk mengganti kecepatan frame untuk UID. Dengan mekanisme ini, SurfaceFlinger memperbarui pemetaan setiap kali mode permainan diubah atau intervensi diperbarui. SurfaceFlinger menangani perubahan FPS dengan mengunci buffer yang sesuai.

Untuk memahami lebih lanjut tentang pembatasan FPS, lihat pengenalan pembatasan FPS .