Kecepatan frame

Library Android Frame Pacing, yang juga dikenal sebagai Swappy, adalah bagian dari Android Game SDK. Library ini membantu game OpenGL dan Vulkan menghasilkan rendering yang lancar dan kecepatan frame yang benar di Android.

Pengaturan 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
  • 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 dengan yang didukung oleh 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 30 fps mencoba merender di perangkat yang secara native mendukung 60 fps, loop render game menyebabkan frame berulang tetap berada di layar selama 16 md lebih lama. Jenis ketidakcocokan ini menciptakan inkonsistensi yang signifikan dalam waktu frame seperti 33 md, 16 md, dan 49 md. Scene yang terlalu kompleks semakin memperparah masalah ini karena menyebabkan terjadinya frame terlewat.

Library Frame Pacing melakukan tugas-tugas berikut:

  • Mengompensasi tersendat akibat frame game pendek.
  • Menggunakan penghalang sinkronisasi untuk frame panjang yang menyebabkan tersendat dan latensi.
    • Menyisipkan waktu tunggu ke dalam aplikasi. Hal ini memungkinkan pipeline tampilan menyamai kecepatan, bukan membiarkan back pressure terjadi.
    • Menggunakan penghalang sinkronisasi (EGL_KHR_fence_sync dan VkFence).
  • Memilih kecepatan refresh untuk memberikan fleksibilitas dan presentasi yang lancar, jika perangkat Anda mendukung beberapa kecepatan refresh.
  • Menyediakan statistik untuk proses debug dan pembuatan profil menggunakan frame stats.

Untuk mempelajari cara mengonfigurasi library agar beroperasi dalam berbagai mode sesuai dengan kebutuhan Anda, lihat Mode operasi yang didukung.

Untuk menerapkan penggunaan perender OpenGL atau perender Vulkan, lihat:

Untuk membaca lebih lanjut, lihat Library Frame Pacing.

Intervensi pembatasan 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.

Penerapan 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 penurunan skala 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 dapat diterjemahkan lebih lanjut menjadi pasangan <UID, Frame Rate> untuk dikirim ke SurfaceFlinger.

SurfaceFlinger

Komponen SurfaceFlinger sudah mendukung pembatasan 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 sesuai dengan kecepatan frame aplikasi. Jika kecepatan frame tidak sinkron dengan VSync, SurfaceFlinger akan menahan frame hingga kecepatan frame dan VSync sinkron.

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 di 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 memperbarui pemetaan setiap kali mode game diubah atau intervensi diperbarui. SurfaceFlinger menangani perubahan FPS dengan mengunci buffer yang sesuai.

Untuk memahami lebih lanjut throttling FPS, lihat Throttling FPS.