Library Android Frame Pacing, yang juga dikenal sebagai Swappy, adalah bagian dari Android Game SDK. Library ini membantu game OpenGL dan Vulkan mencapai rendering yang lancar dan kecepatan frame yang benar di Android.
Kecepatan frame adalah sinkronisasi loop rendering dan logika game dengan subsistem tampilan OS dan hardware tampilan yang mendasarinya. Subsistem tampilan Android didesain untuk menghindari artefak visual tertentu, seperti tearing. Subsistem tampilan menghindari tearing dengan melakukan hal berikut:
- Buffering melewati frame secara internal
- Mendeteksi keterlambatan pengiriman frame
- Melanjutkan untuk menampilkan frame saat ini saat frame terlambat terdeteksi
Waktu tampilan frame yang tidak konsisten disebabkan oleh loop render game yang berjalan dengan kecepatan yang berbeda dengan yang didukung hardware tampilan native. Masalah muncul saat loop render game berjalan terlalu lambat untuk hardware tampilan yang mendasarinya, sehingga menyebabkan waktu tampilan yang tidak konsisten. Misalnya, saat game yang berjalan pada kecepatan 30 fps mencoba merender pada perangkat yang secara native mendukung 60 fps, loop render game akan menyebabkan frame berulang tetap berada di layar selama 16 md lebih lama. Jenis pemutusan ini menyebabkan inkonsistensi yang signifikan dalam waktu render seperti 33 md, 16 md, 49 md, dan sebagainya. Scene yang terlalu kompleks akan semakin memperparah masalah ini karena menyebabkan terjadinya frame terlewat.
Library Frame Pacing melakukan tugas berikut:
- Mengkompensasi tersendat karena frame game yang pendek.
- Menambahkan stempel waktu presentasi sehingga frame ditampilkan tepat waktu, bukan lebih awal.
- Menggunakan ekstensi stempel waktu presentasi
EGL_ANDROID_presentation_time
danVK_GOOGLE_display_timing
.
- Menggunakan pagar sinkronisasi untuk frame panjang yang menyebabkan tersendat dan latensi.
- Memasukkan waktu tunggu ke dalam aplikasi. Hal ini memungkinkan pipeline tampilan menyamai kecepatan, bukan membiarkan back pressure terjadi.
- Menggunakan pagar sinkronisasi (
EGL_KHR_fence_sync
danVkFence
).
- Memilih kecepatan refresh untuk memberikan fleksibilitas dan presentasi yang lancar, jika perangkat Anda mendukung beberapa kecepatan refresh.
- Memberikan statistik untuk proses debug dan pembuatan profil menggunakan statistik frame.
Untuk mempelajari cara mengonfigurasi library agar beroperasi dalam berbagai mode sesuai dengan kebutuhan Anda, lihat Mode operasi yang didukung.
Untuk mengimplementasikan penggunaan perender OpenGL atau perender Vulkan, lihat
- Mengintegrasikan Android Frame Pacing ke dalam perender OpenGL
- Mengintegrasikan Android Frame Pacing ke dalam perender Vulkan
Untuk membaca selengkapnya, lihat Mendapatkan pengaturan kecepatan frame yang tepat.
Intervensi throttling frame per detik
Intervensi throttling frame per detik (FPS) memungkinkan game mengatur kecepatan pada FPS yang sesuai hanya menggunakan perubahan sisi platform dan tanpa memerlukan tindakan apa pun dari pihak developer.
Implementasi intervensi throttling FPS menggunakan komponen berikut:
GameManagerService
Komponen
GameManagerService menyimpan semua informasi per pengguna dan
per game tentang mode game dan intervensi game. Informasi FPS disimpan di
GameManagerService dengan informasi intervensi lainnya, seperti faktor penskalaan turun resolusi,
dalam pemetaan <PACKAGE_NAME, Interventions>
untuk setiap profil pengguna.
Informasi FPS diakses saat mode game diubah atau intervensi diperbarui. UID
bersifat unik untuk setiap PACKAGE_NAME
dan pengguna, dan selanjutnya dapat diterjemahkan menjadi pasangan <UID, Frame Rate>
untuk dikirim ke SurfaceFlinger.
SurfaceFlinger
Komponen SurfaceFlinger sudah mendukung throttle FPS aplikasi selama kecepatan frame adalah pembagi kecepatan refresh layar. Jika terjadi vsync, SurfaceFlinger akan memeriksa validitas vsync untuk aplikasi yang di-throttle dengan memverifikasi apakah stempel waktu vsync sefase dengan kecepatan frame aplikasi. Jika kecepatan frame tidak sefase dengan vsync, SurfaceFlinger akan menahan frame hingga kecepatan frame dan vsync sefase.
Gambar berikut menjelaskan interaksi antara GameManagerService dan SurfaceFlinger:

Gambar 1. Interaksi antara GameServiceManager dan SurfaceFlinger
SurfaceFinger mempertahankan pemetaan pasangan <UID, Frame Rate>
untuk menetapkan prioritas
throttle kecepatan frame baru. UID
bersifat unik antara pengguna dan game, sehingga setiap
pengguna di satu perangkat dapat memiliki setelan kecepatan frame yang berbeda pada game yang sama. Untuk membatasi
kecepatan frame game, GameServiceManager memanggil SurfaceFlinger untuk mengganti kecepatan frame untuk
UID. Dengan mekanisme ini, SurfaceFlinger akan memperbarui pemetaan setiap kali
mode game diubah atau intervensi diperbarui. SurfaceFlinger menangani perubahan FPS
dengan mengunci buffer yang sesuai.
Untuk lebih memahami throttling FPS, lihat pengantar throttling FPS.