Bellek kullanımı, Android oyun geliştirme sürecinde kritik öneme sahiptir. Unreal Engine kullanarak oyun geliştirirken bu bellek kısıtlamalarını karşılamak, bellek sızıntılarını ve aşırı bellek ayırmalarını önlemek için bellek durumunu sürekli olarak analiz etmeli ve izlemelisiniz.
Gölgeleyici permütasyonunu azaltarak bellek tasarrufu
Lighting veya Mobile Shader Permutation
Reduction içinde kullanılmayan seçenekleri kaldırarak gölgelendirici permütasyonlarının sayısını en aza indirebilirsiniz. Bu, uygulama paketi boyutunu önemli ölçüde azaltır, ardışık düzen durumu nesnelerinin (PSO) sayısını düşürür ve kullanılmayan oluşturma hedeflerinin veya sahte dokuların oluşturulmasını önleyerek çalışma zamanı belleğinin azalmasına ve daha iyi performansa yol açar.
Daha fazla bilgi için Mobil Cihazlar İçin Performans Kuralları'ndaki Mobil Cihazlar İçin Çeşitli Işıklandırma ve Gölge Varyasyonu Azaltma Ayarları bölümüne bakın.
Öğe yükleme optimizasyonu
Öğeler, sabit referanslar kullanılarak yüklendiğinde oyunda kullanılmayan bağlı içerikler de aynı anda belleğe yüklenir. Bu durum, gereksiz bellek tüketimine neden olur. Özellikle, Blueprints'te devralma özelliği yanlış kullanıldığında üst öğelerden gereksiz CDO'lar (Class Default Objects) ayrılır ve önemli miktarda bellek boşa harcanır. Bu gibi durumlarda, bellek kullanımını optimize etmek için aşağıdaki teknikleri uygulayın.
- C++ kod tanımı ve veri ayrımı: C++ kodunda
UCLASS(Abstract)kullanarak temel işlevleri tanımlayın ve bunları gerçek verilerden ayırın. - Devralmayı en aza indirin: Veri kurulumunu ve öğe yüklemeyi yalnızca yaprak düğüm planlarında gerçekleştirin.
- Dolaylı referanslar kullanın: Sabit referanslardan kaçınmak için
TSoftObjectPtrkullanarak dolaylı özellik referansları uygulayın ve öğeleri yalnızca çalışma zamanında gerektiğinde kesinlikle eşzamansız olarak yükleyin. - Önlemler: Async Asset Loading'i kullanırken, yükleme tamamlandı geri çağırma işlemi sırasında geçerlilik kontrollerinin (
IsValid) yapıldığından emin olun. Bu sayede, askıda kalan işaretçiler veya kilitlenmeler önlenir.
Daha fazla bilgi için Referencing Assets (Öğelere Referans Verme) ve Building Mobile Games with UE5 (UE5 ile Mobil Oyunlar Geliştirme) başlıklı makaleleri inceleyin.
Akıllı işaretçiler ve çöp toplama (GC) ayarlama
C++ geliştirme sırasında akıllı işaretçiler (ör. TSharedPtr ve TWeakPtr) kullanmak, sarkan işaretçileri ve bellek sızıntılarını önler. Ayrıca, TWeakPtr kullanıldığında nesnelere güçlü referanslar oluşturulmaz. Bu nedenle, çöp toplayıcı nesneleri toplarken referans sayılarını artırmaz. Bu, gereksiz nesne yaşamını önler ve GC'nin geçmesi gereken referans grafiğinin karmaşıklığını azaltarak GC yükünü önemli ölçüde düşürür. Çöp toplama işlemi, seviye geçişleri veya kullanıcı etkileşimi olmadığı gibi etkinliksizlik dönemlerinde ForceGarbageCollection tetiklenerek mobil ortamlarda etkili bir şekilde yönetilebilir. Ayrıca, oyun algılanabilir bir durumdayken veya arka plandayken (ör. onStop geri çağırmalar) de tetiklenebilir. Böylece, çöp toplama işlemi etkin oyun deneyimini etkilemeden gerçekleştirilir.
Daha fazla bilgi için Garbage Collection (Çöp Toplama) ve Smart Pointer (Akıllı İşaretçi) sayfalarını inceleyin.
Yeniden konumlandırma tablosu sıkıştırması kullanılarak yapılan optimizasyon
Yeniden Konumlandırma Tablosu Sıkıştırması, ELF ikili programlarındaki Yeniden Konumlandırma Tablosu boyutunu sıkıştırarak Android ikili program boyutunu küçülten bir optimizasyon yöntemidir. Android minSDKVersion 23 veya daha yeni olduğunda APS Relocation Table Compression desteklenir. minSDKVersion 28 veya daha yeni olduğunda ise RELR Relocation Table Compression da desteklenir ve .so dosyasının boyutu önemli ölçüde küçülür. Bu, yalnızca indirme boyutunu küçültmekle kalmaz, aynı zamanda çalışma zamanında .so mmap'in bellekte kapladığı yeri de azaltarak genel fiziksel bellek baskısını hafifletir.
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";
}
Bu optimizasyonu uygulamak için Proje Ayarları'nda Yeniden konumlandırma tablolarının sıkıştırılmasını etkinleştir veya bEnableAdvancedBinaryCompression değişkeninin etkinleştirildiğini doğrulayın.
RELR sıkıştırmasının ikili programa düzgün şekilde uygulanıp uygulanmadığını kontrol etmek için Android NDK'daki llvm-readelf aracını kullanın.
llvm-readelf -d libUnreal.so | grep RELR
Uygulamada, Unreal Engine'in ThirdPerson şablonunu oluşturmak ve dumpsys meminfo kullanarak ölçüm yapmak, .so mmap için PSS ve RSS kullanımında azalma olduğunu doğrular.
| Kategori | Toplam PSS | Private Dirty | Private Clean | Kirli Değiştirme | Toplam RSS |
|---|---|---|---|---|---|
| .so mmap Sıkıştırmadan önce | 170.210 | 24.360 | 141.564 | 0 | 242.204 |
| .so mmap Sıkıştırmadan sonra | 138.031 | 24.748 | 108.976 | 0 | 210.140 |
Doku sıkıştırma
Genel grafik kaynaklarının bellekte kapladığı yeri azaltmak için uygun doku sıkıştırmayı kullanın. Mobil standart olan Uyarlanabilir Ölçeklenebilir Doku Sıkıştırma (ASTC) kullanıldığında, aynı boyutta ETC2'ye kıyasla üstün görsel kalite elde edilir veya aynı görsel kalite hedefiyle daha düşük bellek tüketimiyle daha yüksek sıkıştırma oranları elde edilir.
Doku akışı optimizasyonu
Mobil ortamlarda, varsayılan Unreal Engine doku akışı havuzu boyutunu doğrudan kullanmak, cihaz özelliklerine kıyasla aşırı büyük bir bellek havuzunun önceden ayrılmasına neden olabilir. Bu nedenle, mobil cihaz profilleri tanımlamak ve cihaz bellek sınırlarına göre uygun bir doku akışı havuzu boyutu seçmek idealdir. Ayrıca, doku istatistiklerini kontrol etmek ve çalışma zamanında aşırı çözünürlüklerde yüksek bellek tüketen dokuları belirlemek için Düzenleyici'nin İstatistik özelliğini kullanın. Bu özelliği Gerekli Doku Çözünürlüğü ile birlikte kullanarak sınırları zorlayabilir veya zorlu dokularda maksimum çözünürlüğü azaltabilirsiniz. Böylece kaynak kullanımı, ayrılan doku belleği arabelleğinde kontrol altında tutulur.