Library Android Frame Pacing, yang juga dikenal sebagai Swappy, adalah bagian dari Android Game SDK. Membantu game OpenGL dan Vulkan menghasilkan rendering yang lancar dan kecepatan frame yang benar di Android.
Kecepatan frame adalah sinkronisasi logika game dan loop rendering dengan subsistem tampilan OS dan perangkat keras tampilan yang mendasarinya. Layar Android sistem dirancang untuk menghindari artefak visual tertentu, seperti sobek. Tujuan subsistem tampilan menghindari kerusakan dengan melakukan hal berikut:
- Buffering melewati frame secara internal
- Mendeteksi keterlambatan pengiriman frame
- Terus menampilkan frame saat ini saat frame terlambat terdeteksi
Waktu tampilan frame yang tidak konsisten disebabkan oleh loop render game yang berjalan pada kecepatan yang berbeda dari apa yang didukung perangkat keras tampilan asli. Masalah muncul saat loop render game berjalan terlalu lambat untuk hardware tampilan yang mendasarinya, yang menyebabkan waktu tampilan yang tidak konsisten. Misalnya, saat {i>game<i} yang berjalan pada 30 fps akan mencoba merender di perangkat yang secara native mendukung 60 fps, render loop game menyebabkan frame berulang tetap berada di layar selama tambahan 16 md. Jenis pemutusan koneksi ini menciptakan inkonsistensi substansial dalam waktu render frame seperti 33 md, 16 md, 49 md, dan seterusnya. Adegan yang terlalu rumit akan bertambah masalah ini karena menyebabkan terjadinya bingkai yang terlewat.
Library Frame Pacing melakukan tugas berikut:
- Mengompensasi ketersendatan 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 fence sinkronisasi untuk frame panjang yang menyebabkan tersendat dan latensi.
- Memasukkan waktu tunggu ke dalam aplikasi. Hal ini memungkinkan pipeline tampilan menangkap naik, daripada membiarkan tekanan kembali meningkat.
- Menggunakan fence 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 frame statistik.
Untuk mempelajari cara mengkonfigurasi {i>library<i} untuk beroperasi dalam mode yang berbeda sesuai dengan sesuai kebutuhan Anda, lihat Mode operasi yang didukung.
Untuk menerapkan 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 Mencapai 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 sisi platform perubahan ini dan tanpa memerlukan tindakan apa pun terhadap bagian.
Implementasi intervensi throttling FPS menggunakan komponen berikut:
LayananPengelolaGame
Komponen GameManagerService mengelola semua data per pengguna dan
informasi per game tentang mode game dan intervensi game. Informasi FPS disimpan di
GameManagerService dengan informasi intervensi lainnya, seperti faktor penurunan skala resolusi,
dalam pemetaan <PACKAGE_NAME, Interventions>
untuk setiap profil pengguna.
Informasi FPS diakses saat mode game diubah atau intervensi diupdate. J
UID
bersifat unik untuk setiap PACKAGE_NAME
dan pengguna, dan dapat diterjemahkan lebih lanjut
menjadi pasangan <UID, Frame Rate>
untuk
dikirim ke SurfaceFlinger.
SurfaceFlinger
Komponen SurfaceFlinger sudah didukung melakukan throttling FPS aplikasi selama kecepatan frame adalah pembagi dari kecepatan refresh layar. Jika terjadi vsync, SurfaceFlinger memeriksa validitas vsync untuk throttle dengan memverifikasi apakah stempel waktu vsync berada dalam fase dengan aplikasi. Jika laju bingkai tidak sesuai dengan {i>vsync<i}, maka SurfaceFlinger akan menyimpan {i>frame<i} hingga kecepatan {i>frame<i} dan {i>vsync<i} berada dalam fase tersebut.
Gambar berikut menjelaskan interaksi antara GameManagerService dan SurfaceFlinger:
SurfaceFinger mempertahankan pemetaan pasangan <UID, Frame Rate>
untuk menetapkan
prioritas throttling kecepatan frame. UID
bersifat unik antara pengguna dan game, sehingga setiap
pengguna di satu perangkat dapat memiliki pengaturan
kecepatan {i>frame<i} yang berbeda di game yang sama. Untuk men-throttle
kecepatan frame game, GameServiceManager memanggil SurfaceFlinger untuk mengganti kecepatan frame untuk
UID. Dengan mekanisme ini, SurfaceFlinger
memperbarui pemetaan setiap kali
mode game diubah atau intervensi diupdate. SurfaceFlinger menangani perubahan FPS
dengan menerapkan buffer yang sesuai.
Untuk memahami throttling FPS selengkapnya, lihat Pengenalan throttling FPS.