Tentang pengelolaan memori

Pengoptimalan memori sangat penting untuk memberikan pengalaman bermain game yang stabil dan berperforma tinggi di Android. Panduan ini memberikan ringkasan tentang alasan efisiensi memori penting, cara sistem operasi Android mengelola batas memori proses, dan metrik memori baru di Konsol Google Play untuk membantu Anda memantau dan meningkatkan kualitas teknis game.

Pentingnya pengoptimalan memori

Mengoptimalkan memori game Anda sangat penting untuk mempertahankan retensi pemain, memperluas kompatibilitas perangkat, dan mematuhi standar kualitas platform:

  • Pencegahan cold start (pengalaman dan retensi pengguna): Saat pemain sementara beralih dari game Anda (misalnya, untuk menjawab notifikasi atau memeriksa pesan), sistem operasi akan menempatkan proses game ke latar belakang. Jika jejak memori latar belakang game terlalu tinggi, Low Memory Killer (LMK) sistem akan memprioritaskan penghentian proses game untuk mengklaim kembali RAM untuk tugas latar depan. Saat pengguna melanjutkan game, game harus menjalani cold start yang panjang—memuat ulang aset grafis, audio, dan biner mesin game yang berat dari penyimpanan—alih-alih melanjutkan game dengan lancar dan instan. Mempertahankan penggunaan memori latar belakang yang rendah akan mencegah penghentian latar belakang yang tidak terlihat ini, mempertahankan status pengguna, dan memastikan pemain dapat melanjutkan sesi mereka dengan segera. Untuk mengetahui detail selengkapnya tentang perilaku LMK sistem, lihat panduan Android Vitals - Low memory killers.
  • Stabilitas ekosistem dan perangkat: Penggunaan memori yang tidak efisien dan kebocoran memori akan menurunkan kesehatan sistem secara keseluruhan. Saat memori sistem langka, sistem akan menghadapi tekanan yang parah, yang mengakibatkan penurunan kecepatan frame, ketersendatan UI, dan gangguan audio. Jika tekanan memori terlalu parah, Low Memory Killer (LMK) sistem akan menghentikan proses latar belakang secara agresif, sehingga aplikasi lain mengalami cold start yang lambat dan status pengguna hilang saat pemain beralih antar-tugas.
  • Penghentian tingkat platform: Mulai Android 17 (level API 37), sistem lebih proaktif dalam menghentikan proses yang menggunakan terlalu banyak memori. Jika jejak game Anda terlalu tinggi, OS dapat menghentikan prosesnya secara tiba-tiba tanpa membuat stack trace standar.
  • Kompatibilitas perangkat: Meskipun perangkat unggulan memiliki RAM 12 GB hingga 16 GB, sebagian besar audiens game global menggunakan perangkat dengan RAM 4 GB atau 6 GB. Pengelolaan memori yang tepat memastikan game Anda tetap dapat diakses dan responsif di semua tingkat hardware tanpa memerlukan paket aset yang kompleks dan terpisah.

Memahami memori di Android

Untuk mendesain strategi penganggaran memori yang efektif, developer harus memahami cara platform Android mengelola memori fisik dan cara platform tersebut mengukur jejak aktif game Anda.

Konsep memori Android inti

Untuk konsep dasar terkait pengelolaan memori tingkat platform, lihat dokumentasi Ringkasan Pengelolaan Memori resmi. Resource ini mencakup empat area arsitektur:

  • Ringkasan memori: Android menggunakan paging dan memory mapping (mmap) untuk mengelola RAM. Android tidak mendukung file swap tradisional di disk; sebagai gantinya, Android mengandalkan kompresi halaman (menggunakan zRAM) dan klaim halaman untuk mengosongkan memori fisik.
  • Alokasi memori di antara proses: Android berbagi RAM di seluruh sistem. Android menetapkan heap tertentu untuk eksekusi mesin virtual Dalvik atau ART, sekaligus memungkinkan lingkungan pengembangan native (seperti mesin game C++) untuk meminta memori dari heap sistem native.
  • Pengelolaan memori aplikasi: Beroperasi di bawah model multi-proses, Android mengharapkan aplikasi memantau status siklus prosesnya secara dinamis dan secara sukarela merilis resource yang tidak diperlukan (seperti grafis dan bitmap yang tidak di-cache) untuk mendukung kesehatan sistem.
  • Ringkasan proses dan thread: Sistem mengategorikan proses ke dalam hierarki berdasarkan visibilitas dan kepentingan yang dirasakan pengguna saat ini, yang menentukan proses mana yang tetap aktif dan proses mana yang dihentikan terlebih dahulu selama kondisi memori rendah.

Metrik jejak memori total

Memory Limiter Android 17 tingkat platform mengevaluasi penggunaan proses menggunakan Jejak Memori Total, bukan ukuran memori virtual atau ukuran residen total (RSS).

Jejak Memori Total = RSS Anonim (RssAnon) + Swap Tidak Dikompresi (VmSwap)

Untuk mencegah game melebihi batas platform, developer harus memahami dengan tepat apa yang diwakili oleh metrik ini di tingkat sistem. Untuk mengetahui informasi selengkapnya tentang metrik ini, alokasi RAM fisik, dan cara menangani halaman yang didukung file, lihat Memahami Metrik RSS dan Swap di panduan Memantau Penggunaan Memori.

Batasan memori

Untuk mempertahankan stabilitas sistem dan memastikan aplikasi tidak menggunakan resource yang berlebihan, platform Android mengelola batas memori untuk proses yang berjalan.

Memory Limiter di Android 17 dan yang lebih baru

Android 17 (level API 37) dan yang lebih baru mengelola batas memori per aplikasi yang ketat menggunakan cgroup v2 Linux untuk mencegah setiap aplikasi menyebabkan ketidakstabilan di seluruh sistem. Untuk mengetahui detail selengkapnya tentang implementasi teknis, lihat Panduan Memory Limiter AOSP dan Memprioritaskan Efisiensi Memori: Langkah Penting untuk Blog Android 17.

  • Mekanisme: Memory Limiter memantau semua proses aplikasi dan menetapkan batas secara dinamis berdasarkan status siklus proses:
    • Proses yang terlihat (latar depan): Proses aplikasi yang saat ini menampilkan UI diharapkan menjalankan kumpulan kerja resource yang lebih besar, dan diberi batas yang lebih besar.
    • Proses yang tidak terlihat (latar belakang atau layanan): Proses aplikasi yang melakukan pekerjaan aktif tanpa menampilkan UI dibatasi oleh anggaran yang lebih ketat dan lebih ketat.
  • Atribut kernel: Layanan ini mengandalkan dua atribut utama:
    • memory.high: Batas lunak. Jika terlampaui, kernel akan membatasi proses dan mencoba mengklaim kembali memori secara agresif. Klaim kembali ini dapat menyebabkan game mengalami penurunan performa.
    • memory.swap.max: Mengelola batas maksimum pada ruang swap atau zRAM yang dapat digunakan proses.
  • Perilaku penghentian: Jika proses terus mengalokasikan memori anonim melewati memory.high dan menghabiskan kapasitas swap-nya, alokasi akan gagal, dan OS akan menghentikan proses secara diam-diam. Penghentian ini dicatat menggunakan ApplicationExitInfo di bagian alasan keluar Memory Limiter (tersedia mulai Android 17, 26Q4).

Memantau penggunaan memori

Untuk mengoptimalkan memori game secara efektif, Anda harus memahami terlebih dahulu cara platform Android mengukur jejaknya. Android 17 memperbarui metrik memori untuk melacak jumlah RSS Anonim (RssAnon) dan Swap yang tidak dikompresi (VmSwap), tidak termasuk memori pribadi GPU atau yang didukung file. Panduan ini menjelaskan cara memanfaatkan alat tingkat sistem seperti Perfetto dan meminfo, menerapkan API diagnostik seperti ProfilingManager dan onTrimMemory, serta mengekstrak alokasi memori yang tepat dalam Unity dan Unreal Engine. Pahami cara membuat profil game Anda secara akurat dan menghindari ketersendatan performa yang terkait dengan polling memori runtime tradisional.

Untuk mengetahui informasi selengkapnya, lihat Memantau Penggunaan Memori.

Strategi pengurangan memori

Meskipun mesin game menyederhanakan pengembangan lintas platform, penanganan memori defaultnya dapat memicu batas memori tingkat OS. Halaman ini menjelaskan langkah-langkah pengoptimalan praktis yang secara khusus disesuaikan untuk Unity dan Unreal Engine. Pahami alasan mengandalkan onTrimMemory berbasis Java dapat menyebabkan kebuntuan di Unity—dan cara menggunakan callback siklus proses native. Anda juga akan menemukan pengoptimalan tingkat aset utama, seperti menggunakan kompresi tekstur ASTC 8x8 dan mengonfigurasi pembongkaran aset, untuk menjaga game Anda berjalan lancar di semua tingkat hardware.