Penggunaan memori sangat penting dalam pengembangan game Android. Saat mengembangkan game menggunakan Unreal Engine, Anda harus terus menganalisis dan melacak status memori untuk memenuhi batasan memori ini, mencegah kebocoran memori dan alokasi memori yang berlebihan.
Penghematan memori melalui pengurangan permutasi shader
Dengan menghapus opsi yang tidak digunakan di Lighting atau Mobile Shader Permutation
Reduction, Anda dapat meminimalkan jumlah permutasi shader. Tindakan ini akan mengurangi ukuran paket aplikasi secara signifikan, menurunkan jumlah objek status pipeline (PSO), dan mencegah pembuatan target render atau tekstur dummy yang tidak digunakan, sehingga mengurangi memori runtime dan meningkatkan performa.
Untuk mengetahui informasi selengkapnya, lihat bagian Misc Lighting and Shader Permutation Reduction Settings for Mobile di Panduan Performa untuk Perangkat Seluler.
Pengoptimalan pemuatan aset
Saat memuat aset menggunakan referensi tetap, konten terhubung yang bahkan tidak digunakan dalam game dimuat ke dalam memori secara bersamaan, sehingga menyebabkan konsumsi memori yang tidak perlu. Secara khusus, jika pewarisan disalahgunakan di Blueprint, CDO (Class Default Objects) yang tidak perlu dari induk akan dialokasikan, sehingga menghabiskan banyak memori. Dalam kasus seperti itu, terapkan teknik berikut untuk mengoptimalkan penggunaan memori.
- Definisi kode dan pemisahan data C++: Tentukan fungsi inti
menggunakan
UCLASS(Abstract)dalam kode C++, dan pisahkan dari data sebenarnya. - Minimalkan pewarisan: Lakukan penyiapan data dan pemuatan aset hanya di Blueprint node daun.
- Gunakan referensi tidak langsung: Terapkan referensi properti tidak langsung menggunakan
TSoftObjectPtruntuk menghindari referensi tetap, dan muat aset secara asinkron hanya jika diperlukan saat runtime. - Tindakan pencegahan: Saat menggunakan Pemuatan Aset Asinkron, pastikan pemeriksaan validitas
(
IsValid) dilakukan selama callback penyelesaian pemuatan untuk mencegah pointer atau error yang tidak valid.
Untuk mengetahui informasi selengkapnya, lihat Mereferensikan Aset dan Mem-build Game Seluler dengan UE5.
Pointer smart dan penyetelan pembersihan sampah memori (GC)
Menggunakan pointer smart (seperti TSharedPtr dan TWeakPtr) selama pengembangan C++ mencegah pointer yang tidak valid dan kebocoran memori. Selain itu, menggunakan TWeakPtr akan menghindari pembuatan referensi yang kuat ke objek, sehingga pengumpul sampah tidak akan menambah jumlah referensi saat mengumpulkan objek. Hal ini mencegah kelangsungan objek yang tidak perlu dan menurunkan kompleksitas grafik referensi yang perlu dilalui GC, sehingga mengurangi overhead GC secara signifikan. Pengumpulan sampah dapat dikelola secara efektif di lingkungan seluler dengan memicu ForceGarbageCollection selama transisi level atau periode tidak aktif, seperti saat tidak ada interaksi pengguna. Selain itu, pengumpulan sampah dapat dipicu saat game berada dalam status yang dapat dirasakan atau di latar belakang (misalnya, callback onStop), sehingga memastikan pengumpulan sampah dilakukan tanpa memengaruhi pengalaman gameplay aktif.
Untuk mengetahui informasi selengkapnya, lihat Pengumpulan Sampah dan Pointer Smart.
Pengoptimalan menggunakan kompresi tabel relokasi
Kompresi Tabel Relokasi adalah metode pengoptimalan yang mengompresi ukuran Tabel Relokasi dalam biner ELF untuk mengurangi ukuran biner Android. Jika Android minSDKVersion adalah 23 atau yang lebih tinggi, Kompresi Tabel Relokasi APS akan didukung; jika minSDKVersion adalah 28 atau yang lebih tinggi, Kompresi Tabel Relokasi RELR juga akan didukung, sehingga mengurangi ukuran file .so secara signifikan. Hal ini tidak hanya mengurangi ukuran download, tetapi juga mengurangi jejak memori .so mmap saat runtime, sehingga mengurangi tekanan memori fisik secara keseluruhan.
AndroidToolChain.cs
if (MinSDKVersion >= 28)
{
Result += " -Wl,--pack-dyn-relocs=android+relr,--use-android-relr-tags";
}
else if (MinSDKVersion >= 23)
{
Result += " -Wl,--pack-dyn-relocs=android";
}
Untuk menerapkan pengoptimalan ini, pastikan Enable compression of relocation tables di Setelan Project atau variabel bEnableAdvancedBinaryCompression diaktifkan.
Untuk memeriksa apakah kompresi RELR diterapkan dengan benar ke program biner, gunakan alat llvm-readelf dari Android NDK.
llvm-readelf -d libUnreal.so | grep RELR
Dalam praktiknya, mem-build template ThirdPerson Unreal Engine dan mengukurnya menggunakan dumpsys meminfo akan mengonfirmasi pengurangan penggunaan PSS dan RSS untuk .so mmap.
| Kategori | Total PSS | Private Dirty | Private Clean | Swap Dirty | Total RSS |
|---|---|---|---|---|---|
| .so mmap Sebelum kompresi | 170.210 | 24.360 | 141.564 | 0 | 242.204 |
| .so mmap Setelah kompresi | 138.031 | 24.748 | 108.976 | 0 | 210.140 |
Kompresi tekstur
Gunakan kompresi tekstur yang sesuai untuk mengurangi jejak memori resource grafis secara keseluruhan. Dengan menggunakan Adaptive Scalable Texture Compression (ASTC), standar seluler, kualitas visual yang lebih unggul akan diberikan dibandingkan dengan ETC2 pada ukuran yang sama, atau mencapai rasio kompresi yang lebih tinggi dengan konsumsi memori yang lebih rendah di bawah target kualitas visual yang sama.
Pengoptimalan streaming tekstur
Di lingkungan seluler, menggunakan ukuran kumpulan streaming teksturUnreal Engine default secara langsung dapat mengalokasikan kumpulan memori yang terlalu besar dibandingkan dengan spesifikasi perangkat. Oleh karena itu, sebaiknya tentukan Profil Perangkat seluler dan pilih ukuran kumpulan streaming tekstur yang sesuai dengan batas memori perangkat. Selain itu, gunakan fitur Statistic Editor untuk memeriksa statistik tekstur dan mengidentifikasi tekstur yang menggunakan memori tinggi yang menempati resolusi ekstrem saat runtime. Gabungkan dengan fitur Required Texture Resolution untuk menerapkan batas atau mengurangi resolusi maksimum pada tekstur yang berat, sehingga penggunaan resource tetap terkontrol dalam buffer memori tekstur yang dialokasikan.