Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Meningkatkan performa game Anda

Pemain akan sangat senang jika game Anda memiliki waktu pemuatan yang cepat, framerate yang konsisten, dan responsivitas input yang dapat diandalkan.

Jika pernah mengembangkan game untuk komputer atau konsol, Anda mungkin terkejut mendapati betapa berbedanya perangkat tersebut dibandingkan perangkat seluler dari segi ukuran GPU dan performa memori flash. Perbedaan struktur sistem ini dapat menyulitkan Anda untuk memprediksi performa game di Android.

Panduan ini akan membantu Anda mengoptimalkan game agar performanya dapat diandalkan di berbagai perangkat Android yang menjalankannya. Secara khusus, panduan ini menjelaskan cara mengonfigurasi pelacakan sistem game Android. Panduan ini juga menjelaskan cara menggunakan laporan output dari pelacakan sistem untuk membantu Anda mencermati aspek tertentu dalam performa game Anda.

Menyiapkan pelacakan sistem berbasis game

Fitur Systrace, yang tersedia sebagai program command line dan layanan pada perangkat, merekam profil CPU dan thread aplikasi Anda untuk waktu terbatas. Anda dapat menggunakan hasil yang ditampilkan dalam laporan Systrace untuk memahami performa game Anda di Android dengan lebih baik, dan mengidentifikasi cara terbaik untuk meningkatkan efisiensi dan responsivitas game.

Systrace adalah fitur yang sangat ringan dijalankan dan menawarkan manfaat berikut:

  • Memberikan kebenaran dasar. Systrace merekam output langsung dari kernel, sehingga metrik yang direkamnya nyaris identik dengan yang dilaporkan oleh serangkaian panggilan sistem.
  • Menggunakan sedikit resource. Systrace memberikan overhead yang sangat rendah pada perangkat, biasanya kurang dari 1%, karena data dialirkan ke dalam buffer dalam memori.

Setelan yang optimal

Terlepas dari cara Anda merekam pelacakan sistem, sebaiknya Anda tetap memberi fitur ini argumen yang tepat:

  • Kategori: Kumpulan kategori terbaik yang sebaiknya diaktifkan untuk pelacakan sistem berbasis game meliputi: {sched, freq, idle, am, wm, gfx, view, sync, binder_driver, hal, dalvik}.
  • Ukuran buffer: Aturan umumnya adalah ukuran buffer sebesar 10 MB per core CPU dapat mendukung pelacakan sekitar 20 detik. Misalnya, jika perangkat memiliki dua CPU quad core (total 8 core), nilai yang sesuai untuk diteruskan ke program systrace adalah 80.000 KB (80 MB).

    Namun, jika game Anda banyak melakukan peralihan konteks, Anda perlu meningkatkan buffer menjadi 15 MB per core CPU.

  • Peristiwa kustom: Jika Anda ingin merekam peristiwa kustom dalam game, aktifkan flag -a, agar Systrace menyertakan peristiwa kustom tersebut dalam laporan output.

Jika Anda menggunakan program command line systrace, gunakan perintah berikut untuk merekam pelacakan sistem yang menerapkan praktik terbaik untuk kumpulan kategori, ukuran buffer, dan peristiwa kustom:

    python systrace.py -a com.example.myapp -b 80000 -o my_systrace_report.html \
      sched freq idle am wm gfx view sync binder_driver hal dalvik
    

Jika Anda menggunakan aplikasi sistem Systrace pada perangkat, selesaikan langkah-langkah berikut untuk merekam pelacakan sistem yang menerapkan praktik terbaik untuk kumpulan kategori, ukuran buffer, dan peristiwa kustom:

  1. Aktifkan opsi Trace debuggable applications.
  2. Di bagian Buffer size, pilih 65536 (sekitar 64 MB). Perhatikan, agar dapat menggunakan setelan ini, perangkat harus memiliki persediaan memori 256 MB atau 512 MB (tergantung apakah CPU-nya memiliki 4 atau 8 core), dan setiap 64 MB dari memori tersebut harus tersedia sebagai bagian yang berdekatan.
  3. Pilih Categories, lalu aktifkan kategori dalam daftar berikut:

    • am: Activity Manager (Pengelola Aktivitas)
    • binder_driver: Binder Kernel driver (Driver Binder Kernel)
    • dalvik: Dalvik VM (Mesin Virtual Dalvik)
    • freq: CPU Frequency (Frekuensi CPU)
    • gfx: Graphics (Grafis)
    • hal: Hardware Modules (Modul Hardware)
    • idle: CPU Idle (CPU Tanpa Aktivitas
    • sched: CPU Scheduling (Penjadwalan CPU)
    • sync: Synchronization (Sinkronisasi)
    • view: View System (Sistem Tampilan)
    • wm: Window Manager (Pengelola Jendela)
  4. Aktifkan Record tracing.

  5. Muat game Anda.

  6. Lakukan interaksi dalam game Anda sesuai alur game yang performa perangkatnya ingin diukur.

  7. Begitu menemukan perilaku yang tidak diinginkan dalam game Anda, aktifkan pelacakan sistem. Anda akan mulai merekam statistik performa yang diperlukan untuk menganalisis masalah itu lebih jauh.

Untuk menghemat ruang disk, pelacakan sistem pada perangkat menyimpan file dalam format pelacakan terkompresi (*.ctrace). Untuk mengekstrak file ini saat membuat laporan, gunakan program command line dan sertakan opsi --from-file:

    python systrace.py --from-file=/data/local/traces/my_game_trace.ctrace \
      -o my_systrace_report.html
    

Meningkatkan area performa tertentu

Bagian ini menyoroti beberapa masalah performa yang umum dalam game seluler dan menjelaskan cara mengidentifikasi dan menyempurnakan aspek-aspek tersebut dalam game Anda.

Kecepatan pemuatan

Pemain ingin mulai memainkan game Anda secepat mungkin, karena itu waktu muat game Anda harus dibuat sesingkat mungkin. Tindakan berikut dapat membantu mengurangi waktu pemuatan:

  • Jalankan pemuatan lambat. Jika Anda menggunakan aset yang sama di sejumlah adegan atau level yang berurutan dalam game, muat aset ini sekali saja.
  • Kurangi ukuran aset. Dengan begitu, Anda dapat memaketkan aset tersebut tanpa kompresi bersama APK game Anda.
  • Gunakan metode kompresi yang hemat disk. Contoh dari metode ini adalah zlib.
  • Gunakan IL2CPP, bukan mono. (Hanya berlaku jika Anda menggunakan Unity.) IL2CPP memberikan performa yang lebih baik untuk skrip C# Anda.
  • Jadikan game Anda multi-thread. Untuk detail selengkapnya, lihat bagian konsistensi framerate.

Konsistensi framerate

Salah satu elemen terpenting dari pengalaman alur game adalah mencapai framerate yang konsisten. Untuk mempermudah pencapaian sasaran ini, ikuti teknik pengoptimalan yang dijelaskan di bagian ini.

Multithreading

Saat mengembangkan aplikasi untuk banyak platform, sebaiknya tempatkan semua aktivitas dalam game Anda di satu thread. Meskipun mudah diterapkan di banyak mesin game, metode eksekusi ini tidak optimal saat menjalankan game pada perangkat Android. Akibatnya, game thread tunggal sering lambat dimuat dan tidak memiliki framerate yang konsisten.

Systrace yang ditunjukkan pada Gambar 1 menunjukkan perilaku standar untuk game yang berjalan pada satu CPU pada satu waktu:

Diagram thread di dalam pelacakan sistem

Gambar 1. Laporan Systrace untuk game thread tunggal

Untuk meningkatkan performa game Anda, jadikan game Anda multi-thread. Biasanya, model terbaiknya adalah menggunakan 2 thread:

  • Satu thread game, yang berisi modul utama game dan mengirim perintah render.
  • Satu thread render, yang menerima perintah render dan mengubahnya menjadi perintah grafis yang dapat digunakan CPU perangkat untuk menampilkan adegan.

Vulkan API dikembangkan berdasarkan model ini, mengingat kapabilitasnya untuk mengirim 2 buffer umum secara paralel. Dengan fitur ini, Anda dapat mendistribusikan beberapa thread render ke banyak CPU, yang akan semakin meningkatkan waktu rendering adegan.

Anda juga dapat membuat beberapa perubahan untuk mesin tertentu untuk menunjang performa multithreading game:

  • Jika Anda mengembangkan game menggunakan mesin game Unity, aktifkan opsi Multithreaded Rendering dan GPU Skinning.
  • Jika Anda menggunakan mesin rendering kustom, pastikan pipeline perintah render selaras sepenuhnya dengan pipeline perintah grafis; jika tidak, penayangan adegan game dapat tertunda.

Setelah menerapkan perubahan ini, game Anda akan menggunakan resource di setidaknya 2 CPU secara simultan, seperti ditunjukkan pada Gambar 2:

Diagram thread di dalam pelacakan sistem

Gambar 2. Laporan Systrace untuk game multi-thread

Pemuatan elemen UI

Diagram tumpukan frame di dalam pelacakan sistem
Gambar 3. Laporan Systrace untuk game yang merender belasan elemen UI secara bersamaan

Saat membuat game yang sarat fitur, Anda mungkin tergoda untuk menampilkan berbagai opsi dan aksi secara bersamaan kepada pemain. Namun, untuk mempertahankan framerate yang konsisten, pertimbangkan ukuran layar perangkat seluler yang relatif kecil dan usahakan UI Anda sesederhana mungkin.

Laporan Systrace pada Gambar 3 menunjukkan contoh frame UI yang mencoba merender elemen yang terlalu banyak untuk kapabilitas perangkat seluler.

Usahakan mengurangi waktu update UI menjadi 2-3 milidetik. Untuk mencapai update secepat ini, jalankan pengoptimalan seperti berikut:

  • Update hanya elemen di layar yang telah bergerak.
  • Batasi jumlah tekstur dan lapisan UI. Pertimbangkan untuk menggabungkan panggilan grafis, seperti shader dan tekstur, yang menggunakan materi yang sama.
  • Alihkan operasi animasi elemen ke GPU.
  • Jalankan frustum dan occlusion culling yang lebih agresif.
  • Jika mungkin, jalankan operasi draw menggunakan Vulkan API. Overhead panggilan draw lebih rendah pada Vulkan.

Pemakaian daya

Meskipun sudah melakukan pengoptimalan yang dibahas di atas, Anda mungkin mendapati bahwa framerate game Anda menurun dalam 45-50 menit pertama alur game. Selain itu, suhu perangkat mungkin mulai naik dan pemakaian daya baterai meningkat seiring waktu.

Dalam banyak kasus, konsumsi daya dan suhu yang tidak diinginkan ini terkait dengan distribusi beban kerja game Anda ke seluruh CPU perangkat. Untuk meningkatkan efisiensi konsumsi daya game Anda, terapkan praktik terbaik yang ditunjukkan di bagian berikut.

Pertahankan thread yang menggunakan banyak memori di satu CPU

Di banyak perangkat seluler, cache L1 berada di CPU tertentu, dan cache L2 berada di set CPU yang membagikan jam. Untuk memaksimalkan hit cache L1, usahakan thread utama game Anda, juga thread lain yang menggunakan banyak memori, tetap berjalan di satu CPU.

Alihkan tugas berdurasi singkat ke CPU yang menggunakan sedikit daya

Kebanyakan mesin game, termasuk Unity, tahu cara mengalihkan operasi thread pekerja ke CPU lain yang berkaitan dengan thread utama game. Namun, mesin ini tidak mengetahui arsitektur spesifik perangkat dan tidak dapat mengantisipasi beban kerja game sebaik Anda.

Kebanyakan perangkat system-on-a-chip memiliki setidaknya 2 jam bersama, satu untuk CPU cepat dan satu untuk CPU lambat. Akibat dari arsitektur ini adalah, jika satu CPU cepat perlu beroperasi pada kecepatan maksimum, semua CPU cepat lainnya juga beroperasi pada kecepatan maksimum.

Contoh laporan pada Gambar 4 menunjukkan game yang memanfaatkan CPU cepat. Namun, level aktivitas tinggi ini memakai banyak daya dan menimbulkan kenaikan suhu dengan cepat.

Diagram thread di dalam pelacakan sistem

Gambar 4. Laporan Systrace yang menunjukkan penetapan thread yang kurang optimal ke CPU perangkat

Untuk mengurangi penggunaan daya secara keseluruhan, sebaiknya atur penjadwal sehingga tugas-tugas berdurasi singkat—seperti memuat audio, menjalankan thread pekerja, dan mengeksekusi koreografer—dialihkan ke set CPU lambat pada perangkat. Pindahkan sebanyak mungkin tugas semacam ini ke CPU lambat untuk mempertahankan framerate yang diinginkan.

Kebanyakan perangkat mencantumkan CPU lambat sebelum CPU cepat, tetapi Anda tidak dapat mengasumsikan bahwa SOC perangkat Anda menggunakan urutan ini. Untuk memeriksa, jalankan perintah yang mirip dengan yang ditunjukkan dalam kode penemuan topologi CPU ini di GitHub.

Setelah mengetahui CPU mana yang merupakan CPU lambat di perangkat Anda, Anda dapat mendeklarasikan afinitas untuk thread berdurasi singkat, yang diikuti oleh penjadwal perangkat. Caranya, tambahkan kode berikut dalam setiap thread:

    &num;include <sched.h>
    &num;include <sys/types.h>
    &num;include <unistd.h>

    pid_t my_pid; // PID of the process containing your thread.

    // Assumes that cpu0, cpu1, cpu2, and cpu3 are the "slow CPUs".
    cpu_set_t my_cpu_set;
    CPU_ZERO(&my_cpu_set);
    CPU_SET(0, &my_cpu_set);
    CPU_SET(1, &my_cpu_set);
    CPU_SET(2, &my_cpu_set);
    CPU_SET(3, &my_cpu_set);
    sched_setaffinity(my_pid, sizeof(cpu_set_t), &my_cpu_set);
    

Latensi sentuh-hingga-tampil

Game yang merender frame secepat mungkin menghasilkan skenario terkait GPU, di mana buffer frame menjadi terlalu sesak. CPU harus menunggu GPU, dan hal ini menimbulkan jeda yang terasa antara saat pemain memberikan input dengan tampilnya efek dari input tersebut di layar.

Untuk mengetahui apakah kecepatan frame game dapat ditingkatkan, selesaikan langkah-langkah berikut:

  1. Dapatkan laporan Systrace yang menyertakan kategori gfx dan input. Kategori ini memuat pengukuran yang sangat berguna untuk mengetahui latensi sentuh-hingga-tampil.
  2. Lihat bagian SurfaceView di laporan Systrace. Buffer yang terlalu sesak mengakibatkan jumlah draw buffer yang tertunda berubah-ubah antara 1 dan 2, seperti ditunjukkan pada Gambar 5:

    Diagram antrian buffer di dalam pelacakan sistem

    Gambar 5. Laporan Systrace yang menampilkan buffer terlalu sesak, yang secara berkala terlalu penuh untuk menerima perintah draw

Untuk mengurangi inkonsistensi dalam kecepatan frame ini, selesaikan tindakan yang dijelaskan dalam bagian berikut:

Integrasikan Android Frame Pacing API ke dalam game

Android Frame Pacing API membantu Anda menjalankan pertukaran frame dan menentukan interval pertukaran sedemikian rupa sehingga game Anda mempertahankan framerate yang lebih konsisten.

Kurangi resolusi aset non-UI dalam game

Layar perangkat seluler modern memiliki jumlah piksel yang jauh lebih banyak daripada yang dapat diproses pemain, sehingga aman-aman saja jika Anda mengurangi sampel (downsampling) sedemikian rupa sehingga rangkaian 5 atau bahkan 10 piksel semuanya memuat satu warna. Mengingat struktur sebagian besar cache layar, sebaiknya kurangi resolusi untuk satu dimensi saja.

Namun, jangan mengurangi resolusi elemen UI game. Anda harus mempertahankan ketebalan garis pada elemen ini untuk memberikan ukuran target sentuh yang cukup besar untuk semua pemain.

Kelancaran proses rendering

Saat SurfaceFlinger mengait ke buffer tampilan untuk menampilkan adegan dalam game Anda, aktivitas CPU akan meningkat sesaat. Jika lonjakan aktivitas CPU ini tidak merata, kemungkinan game Anda akan tersendat. Diagram pada Gambar 6 di bawah menunjukkan alasan terjadinya hal ini:

Diagram frame yang melewatkan jendela Vsync karena sangat terlambat memulai menggambar

Gambar 6. Laporan Systrace yang menunjukkan bagaimana sebuah frame dapat melewatkan Vsync

Jika sebuah frame terlambat memulai operasi draw, bahkan hingga beberapa milidetik, jendela tampilan berikutnya akan terlewatkan. Frame tersebut harus menunggu Vsync berikutnya ditampilkan (33 milidetik jika menjalankan game pada 30 FPS), dan hal ini akan menyebabkan jeda yang terasa dari perspektif pemain.

Untuk mengatasi situasi ini, gunakan Android Frame Pacing API, yang selalu menyajikan frame baru di wavefront VSync.

Status memori

Jika menjalankan game dalam waktu yang lama, kemungkinan perangkat akan menampilkan error memori habis.

Dalam situasi semacam ini, periksa aktivitas CPU dalam laporan Systrace dan lihat seberapa sering sistem melakukan panggilan ke daemon kswapd. Jika jumlah panggilan selama eksekusi game tinggi, sebaiknya perhatikan bagaimana game Anda mengelola dan membersihkan memori.

Untuk informasi selengkapnya, lihat Mengelola memori dalam game secara efektif.

Status thread

Saat membuka-buka elemen standar dalam laporan Systrace, Anda dapat melihat banyaknya waktu yang dihabiskan thread tertentu di setiap status thread yang mungkin dengan memilih thread tersebut dalam laporan, seperti ditunjukkan pada Gambar 7:

Diagram laporan Systrace

Gambar 7. Laporan Systrace yang menunjukkan bahwa pemilihan sebuah thread akan memunculkan ringkasan status untuk thread tersebut

Seperti ditunjukkan pada Gambar 7, Anda dapat melihat bahwa thread game Anda tidak berstatus "running" atau "runnable" sesering yang seharusnya. Alasan mengapa thread tertentu mungkin beralih secara berkala ke status yang tidak biasa meliputi:

  • Jika thread tidur dalam waktu lama, thread tersebut mungkin mengalami pertentangan kunci atau menunggu adanya aktivitas GPU.
  • Jika thread terus-menerus diblokir di I/O, Anda mungkin membaca terlalu banyak data dari disk pada satu waktu, atau game Anda mengalami thrashing.

Referensi lainnya

Untuk mempelajari cara meningkatkan performa game Anda lebih lanjut, lihat referensi tambahan berikut.

Video