Unity oyununuzdaki LMK'ları çözmek için sistematik bir süreç izlemeniz gerekir:

Bellek anlık görüntüsü alma
Unity tarafından yönetilen bellek anlık görüntüsü almak için Unity Profiler'ı kullanın. Şekil 2'de, Unity'nin oyununuzdaki belleği yönetmek için kullandığı bellek yönetimi katmanları gösterilmektedir.

Yönetilen bellek
Unity'nin bellek yönetimi, belleği otomatik olarak ayırmak ve atamak için yönetilen bir yığın ve çöp toplayıcı kullanan bir kontrollü bellek katmanı uygular. Yönetilen bellek sistemi, Mono veya IL2CPP tabanlı bir C# komut dosyası oluşturma ortamıdır. Yönetilen bellek sisteminin avantajı, bellek ayırmalarını otomatik olarak boşaltmak için bir çöp toplayıcı kullanmasıdır.
C# yönetilmeyen bellek
Yönetilmeyen C# bellek katmanı, yerel bellek katmanına erişim sağlayarak C# kodu kullanırken bellek ayırmaları üzerinde hassas kontrol sağlar. Bu bellek yönetimi katmanına Unity.Collections ad alanından ve UnsafeUtility.Malloc ve UnsafeUtility.Free gibi işlevlerle erişilebilir.
Yerel bellek
Unity'nin dahili C/C++ çekirdeği, sahneleri, öğeleri, grafik API'lerini, sürücüleri, alt sistemleri ve eklenti arabelleklerini yönetmek için yerel bellek sistemini kullanır. Doğrudan erişim kısıtlanmış olsa da Unity'nin C# API'si ile verileri güvenli bir şekilde işleyebilir ve verimli yerel koddan yararlanabilirsiniz. Yerel bellek nadiren doğrudan etkileşim gerektirir ancak Profiler'ı kullanarak yerel belleğin performans üzerindeki etkisini izleyebilir ve performansı optimize etmek için ayarları düzenleyebilirsiniz.
Şekil 3'te gösterildiği gibi, C# ile yerel kod arasında bellek paylaşımı yapılmaz. C# tarafından gerekli olan veriler, her ihtiyaç duyulduğunda yönetilen bellek alanında ayrılır.
Yönetilen oyunun kodunun (C#) motorun yerel bellek verilerine erişmesi için (ör.GameObject.transform çağrısı, yerel alandaki bellek verilerine erişmek için yerel bir çağrı yapar ve ardından Bindings kullanarak değerleri C#'ye döndürür) Bağlamalar, her platform için uygun çağırma kurallarını sağlar ve yönetilen türlerin yerel eşdeğerlerine otomatik olarak sıralanmasını işler.
Bu durum yalnızca ilk kez gerçekleşir. Bunun nedeni, dönüştürme özelliğine erişmek için kullanılan yönetilen kabuğun yerel kodda korunmasıdır. Dönüştürme özelliğinin önbelleğe alınması, yönetilen kod ile yerel kod arasındaki ileri geri çağrıların sayısını azaltabilir ancak önbelleğe almanın faydası, özelliğin ne sıklıkta kullanıldığına bağlıdır. Ayrıca, bu API'lere eriştiğinizde Unity'nin yerel belleğin bölümlerini yönetilen belleğe kopyalamadığını da unutmayın.

Daha fazla bilgi edinmek için Unity'de bellek tanıtımı başlıklı makaleyi inceleyin.
Ayrıca, oyununuzun sorunsuz çalışmasını sağlamak için bir bellek bütçesi oluşturmak çok önemlidir. Bellek tüketimi analizi veya raporlama sistemi uygulamak ise her yeni sürümün bellek bütçesini aşmamasını sağlar. Play Mode testlerini sürekli entegrasyon (CI) ile entegre ederek oyunun belirli alanlarındaki bellek tüketimini doğrulama, daha iyi analizler elde etmenizi sağlayacak bir diğer stratejidir.
Öğeleri yönetme
Bu, bellek tüketiminin en etkili ve üzerinde işlem yapılabilen kısmıdır. Profili olabildiğince erken oluşturun.
Android oyunlarındaki bellek kullanımı; oyunun türüne, öğelerin sayısına ve türlerine, bellek optimizasyonu stratejilerine bağlı olarak önemli ölçüde değişebilir. Ancak, bellek kullanımına en çok katkıda bulunanlar genellikle dokular, ağlar, ses dosyaları, gölgelendiriciler, animasyonlar ve komut dosyalarıdır.
Yinelenen öğeleri algılama
İlk adım, bellek profil oluşturucu, derleme raporu aracı veya Proje Denetleyicisi'ni kullanarak kötü yapılandırılmış öğeleri ve yinelenen öğeleri tespit etmektir.
Dokular
Oyununuzun cihaz desteğini analiz edin ve doğru doku biçimine karar verin. Play Asset Delivery, Addressable veya AssetBundle ile daha manuel bir süreç kullanarak üst düzey ve alt düzey cihazlar için doku paketlerini bölebilirsiniz.
Mobil Oyun Performansınızı Optimize Etme ve Unity Doku İçe Aktarma Ayarlarını Optimize Etme başlıklı tartışma gönderisinde yer alan en bilinen önerileri uygulayın. Ardından şu çözümleri deneyin:
Daha az bellek alanı için dokuları ASTC biçimleriyle sıkıştırın ve 8x8 gibi daha yüksek bir blok oranıyla denemeler yapın.
ETC2 kullanılması gerekiyorsa dokularınızı Atlas'ta paketleyin. Birden fazla dokuyu tek bir dokuya yerleştirmek, dokunun ikinin kuvveti olmasını sağlar, çizim çağrılarını azaltabilir ve oluşturmayı hızlandırabilir.
RenderTarget doku biçimini ve boyutunu optimize edin. Gereksiz yere yüksek çözünürlüklü dokular kullanmaktan kaçının. Mobil cihazlarda daha küçük dokular kullanmak bellekten tasarruf sağlar.
Doku belleğini kaydetmek için Doku kanalı paketleme'yi kullanın.
Örgüler ve modeller
Temel ayarları (sayfa 27) kontrol ederek başlayın ve şu ağ içe aktarma ayarlarını doğrulayın:
- Gereksiz ve daha küçük örgüleri birleştirin.
- Sahnelerdeki nesnelerin (ör. statik veya uzak nesneler) köşe sayısını azaltın.
- Yüksek geometrili öğeler için ayrıntı düzeyi (LOD) grupları oluşturun.
Malzemeler ve gölgelendiriciler
- Derleme işlemi sırasında kullanılmayan gölgelendirici varyantlarını programatik olarak kaldırın.
- Sık kullanılan gölgelendirici varyantlarını, gölgelendirici yinelemesini önlemek için uber gölgelendiricilerde birleştirin.
- VRAM/RAM'de önceden yüklenmiş gölgelendiricilerin büyük bellek ayak izini gidermek için dinamik gölgelendirici yüklemeyi etkinleştirin. Ancak gölgelendirici derlemesi karelerde aksaklıklara neden oluyorsa dikkatli olun.
- Tüm varyantların yüklenmesini önlemek için dinamik gölgelendirici yüklemeyi kullanın. Daha fazla bilgi için Improvements to shader build times and memory usage (Gölgeleyici oluşturma sürelerinde ve bellek kullanımında iyileştirmeler) başlıklı blog yayınına bakın.
MaterialPropertyBlocks
'dan yararlanarak malzeme örneklemeyi doğru şekilde kullanın.
Ses
Temel ayarları (sayfa 41) kontrol ederek başlayın ve şu ağ içe aktarma ayarlarını doğrulayın:
- FMOD veya Wwise gibi üçüncü taraf ses motorlarını kullanırken kullanılmayan veya gereksiz
AudioClip
referansları kaldırın. - Ses verilerini önceden yükleme Çalışma zamanında veya sahne başlangıcında hemen gerekmeyen klipler için ön yüklemeyi devre dışı bırakın. Bu, sahne başlatma sırasında bellek yükünü azaltmaya yardımcı olur.
Animasyonlar
- Anahtar kare sayısını en aza indirmek ve gereksiz verileri ortadan kaldırmak için Unity'nin animasyon sıkıştırma ayarlarını düzenleyin.
- Animasyon karesi azaltma: Gereksiz animasyon karelerini otomatik olarak kaldırır.
- Dörtlü sıkıştırma: Bellek kullanımını azaltmak için döndürme verilerini sıkıştırır.
Sıkıştırma ayarlarını Rig veya Animation sekmesindeki Animation Import Settings'ten (Animasyon İçe Aktarma Ayarları) yapabilirsiniz.
Farklı nesneler için animasyon kliplerini çoğaltmak yerine yeniden kullanın.
Bir AnimatorController'ı yeniden kullanmak ve farklı karakterler için belirli klipleri değiştirmek üzere Animator Override Controllers'ı kullanın.
Fizik tabanlı animasyonları pişirin: Animasyonlarınız fizik tabanlı veya prosedürlere dayalıysa çalışma zamanı hesaplamalarını önlemek için bunları animasyon kliplerine pişirin.
İskelet donanımını optimize edin: Karmaşıklığı ve bellek tüketimini azaltmak için donanımınızda daha az kemik kullanın.
- Küçük veya statik nesneler için aşırı kemik kullanmaktan kaçının.
- Belirli kemikler animasyonlu değilse veya gerekmiyorsa bunları rig'den kaldırın.
Animasyon klibinin uzunluğunu kısaltın.
- Animasyon kliplerini yalnızca gerekli kareleri içerecek şekilde kırpın. Kullanılmayan veya aşırı uzun animasyonları depolamayın.
- Tekrarlanan hareketler için uzun klipler oluşturmak yerine döngüye alınmış animasyonlar kullanın.
Yalnızca bir animasyon bileşeninin eklenmiş veya etkinleştirilmiş olduğundan emin olun. Örneğin, Animator'ı kullanıyorsanız Legacy animation (Eski animasyon) bileşenlerini devre dışı bırakın veya kaldırın.
Gereksizse Animator'ı kullanmaktan kaçının. Basit görsel efektler için ara kare oluşturma kitaplıklarını kullanın veya görsel efekti bir komut dosyasına uygulayın. Animator sistemi, özellikle düşük seviye mobil cihazlarda kaynak yoğun olabilir.
Çok sayıda animasyonla çalışırken animasyonlar için İş Sistemi'ni kullanın. Bu sistem, daha az bellek kullanacak şekilde tamamen yeniden tasarlandı.
Sahneler
Yeni sahneler yüklendiğinde öğeler bağımlılık olarak getirilir. Ancak, uygun öğe yaşam döngüsü yönetimi olmadan bu bağımlılıklar referans sayaçları tarafından izlenmez. Bu nedenle, kullanılmayan sahneler kaldırıldıktan sonra bile öğeler bellekte kalabilir ve bellek parçalanmasına neden olabilir.
- Nesne havuzu, yeniden kullanım için bir nesne örnekleri koleksiyonunu tutmak üzere yığın kullandığından ve iş parçacığı açısından güvenli olmadığından, yinelenen oyun öğeleri için GameObject örneklerini yeniden kullanmak üzere Unity'nin nesne havuzunu kullanın.
Instantiate
veDestroy
simgelerini küçültmek hem CPU performansını hem de bellek kararlılığını artırır. - Öğeleri kaldırma:
- Daha az kritik anlarda (ör. açılış ekranları veya yükleme ekranları) öğeleri stratejik olarak kaldırın.
Resources.UnloadUnusedAssets
'nin sık kullanılması, büyük dahili bağımlılık izleme işlemleri nedeniyle CPU işleminde ani artışlara neden olur.- GC.MarkDependencies
profil işaretçisinde büyük CPU artışları olup olmadığını kontrol edin.
Yürütme sıklığını kaldırın veya azaltın ve
Resources.UnloadUnusedAssets()
'a güvenmek yerine Resources.UnloadAsset'i kullanarak belirli kaynakları manuel olarak kaldırın.
- Sahneleri yeniden yapılandırın ve sürekli olarak Resources.UnloadUnusedAssets kullanmayın.
Resources.UnloadUnusedAssets()
içinAddressables
çağrısı, dinamik olarak yüklenen paketlerin yanlışlıkla kaldırılmasına neden olabilir. Dinamik olarak yüklenen öğelerin yaşam döngüsünü dikkatli bir şekilde yönetin.
Çeşitli
Sahne geçişlerinden kaynaklanan parçalanma:
Resources.UnloadUnusedAssets()
yöntemi çağrıldığında Unity şunları yapar:- Artık kullanılmayan öğeler için bellekte yer açar.
- Yönetilen ve yerel nesne yığınında kullanılmayan öğeleri kontrol etmek ve bunları kaldırmak için çöp toplayıcı benzeri bir işlem çalıştırır.
- Etkin bir referans olmaması koşuluyla doku, örgü ve öğe belleğini temizler.
AssetBundle
veyaAddressable
: Bu alanda değişiklik yapmak karmaşıktır ve stratejileri uygulamak için ekibin ortak çabası gerekir. Ancak bu stratejiler öğrenildikten sonra bellek kullanımını önemli ölçüde iyileştirir, indirme boyutunu küçültür ve bulut maliyetlerini düşürür. Unity'de öğe yönetimi hakkında daha fazla bilgi içinAddressables
başlıklı makaleyi inceleyin.Merkezi paylaşılan bağımlılıklar: Gölgelendiriciler, dokular ve yazı tipleri gibi paylaşılan bağımlılıkları sistematik olarak özel paketler veya
Addressable
gruplar halinde gruplandırın. Bu, yinelenmeyi azaltır ve gereksiz öğelerin verimli bir şekilde kaldırılmasını sağlar.Bağımlılık izleme için
Addressables
kullanın. Adreslenebilirler, yükleme ve kaldırma işlemlerini basitleştirir. Artık referans verilmeyen bağımlılıkları otomatik olarak kaldırabilir. İçerik yönetimi ve bağımlılık çözümü içinAddressables
'ya geçiş, oyunun özel durumuna bağlı olarak uygulanabilir bir çözüm olabilir. Gereksiz kopyaları veya bağımlılıkları belirlemek için Bağımlılık zincirlerini Analiz aracıyla analiz edin. Alternatif olarak, AssetBundle'ları kullanıyorsanız Unity Data Tools'a bakın.TypeTrees
- OyununuzunAddressables
veAssetBundles
, oyuncuyla aynı Unity sürümü kullanılarak oluşturulup dağıtılıyorsa ve diğer oyuncu derlemeleriyle geriye dönük uyumluluk gerektirmiyorsaTypeTree
yazmayı devre dışı bırakmayı düşünebilirsiniz. Bu işlem, paket boyutunu ve seri hale getirilmiş dosya nesnesi bellek alanını azaltır. Yerel Addressables paket ayarındaki ContentBuildFlags'de derleme sürecini DisableWriteTypeTree olarak değiştirin.
Çöp toplayıcı dostu kod yazma
Unity, kullanılmayan belleği otomatik olarak tanımlayıp boşaltarak belleği yönetmek için çöp toplama (GC) özelliğini kullanır. GC gerekli olsa da düzgün şekilde ele alınmazsa performans sorunlarına (ör. kare hızı artışları) neden olabilir. Bu işlem, oyunu anlık olarak duraklatarak performans sorunlarına ve ideal olmayan bir kullanıcı deneyimine yol açabilir.
Yönetilen yığın ayırmalarının sıklığını azaltmayla ilgili faydalı teknikler için Unity kılavuzuna, örnekler için ise UnityPerformanceTuningBible'ın 271. sayfasına bakın.
Çöp toplayıcı ayırmalarını azaltın:
- Yığın belleği ayıran LINQ, lambda ve kapatma işlemlerinden kaçının.
- Dize birleştirme yerine değiştirilebilir dizeler için
StringBuilder
kullanın. - Koleksiyonları yeniden oluşturmak yerine
COLLECTIONS.Clear()
çağırarak yeniden kullanın.
Daha fazla bilgiyi Unity oyunlarında profil oluşturmayla ilgili kapsamlı rehber e-kitabında bulabilirsiniz.
Kullanıcı arayüzü tuval güncellemelerini yönetme:
- Kullanıcı arayüzü öğelerinde yapılan dinamik değişiklikler: Metin, resim veya
RectTransform
gibi kullanıcı arayüzü öğeleri güncellendiğinde (ör. metin içeriği değiştirildiğinde, öğelerin boyutu yeniden ayarlandığında veya konumlar animasyonlandırıldığında) motor, geçici nesneler için bellek ayırabilir. - Dize ayırmaları: Metin gibi kullanıcı arayüzü öğeleri, çoğu programlama dilinde dizeler değişmez olduğundan genellikle dize güncellemeleri gerektirir.
- Kirli kanvas: Bir kanvastaki bir şey değiştiğinde (örneğin, yeniden boyutlandırma, öğeleri etkinleştirme ve devre dışı bırakma veya düzen özelliklerini değiştirme) kanvasın tamamı ya da bir kısmı kirli olarak işaretlenip yeniden oluşturulabilir. Bu durum, geçici veri yapılarının (ör. ağ verileri, köşe arabellekleri veya düzen hesaplamaları) oluşturulmasını tetikleyebilir ve bu da çöp oluşturma sürecine katkıda bulunur.
- Karmaşık veya sık güncellemeler: Tuvalde çok sayıda öğe varsa ya da tuval sık sık güncelleniyorsa (ör. her karede) bu yeniden oluşturmalar önemli bir bellek kaybına neden olabilir.
- Kullanıcı arayüzü öğelerinde yapılan dinamik değişiklikler: Metin, resim veya
Ayırma temizlemelerini birden fazla kareye yayarak büyük toplama artışlarını azaltmak için artımlı GC'yi etkinleştirin. Bu seçeneğin oyununuzun performansını ve bellek kullanımını iyileştirip iyileştirmediğini doğrulamak için profilleme yapın.
Oyununuz kontrollü bir yaklaşım gerektiriyorsa çöp toplama modunu manuel olarak ayarlayın. Ardından, seviye değişikliğinde veya aktif oyun oynanmayan başka bir anda çöp toplama işlemini çağırın.
Oyun durumu geçişleri (ör. seviye değiştirme) için manuel atık toplama GC.Collect() çağrılarını etkinleştirin.
Basit kod uygulamalarıyla başlayarak ve gerekirse büyük diziler için yerel diziler veya diğer yerel kapsayıcıları kullanarak dizileri optimize edin.
Yönetilen nesneleri, yok edildikten sonra kalıcı olan yönetilmeyen nesne referanslarını izlemek için Unity Memory Profiler gibi araçları kullanarak izleyin.
Otomatik bir yaklaşım için Performans Raporlama Aracı'na göndermek üzere Profiler İşaretçisi kullanın.
Bellek sızıntılarını ve parçalanmasını önleme
Bellek sızıntıları
C# kodunda, bir Unity Object referansı nesne yok edildikten sonra varsa Managed Shell olarak bilinen yönetilen sarmalayıcı nesne bellekte kalır. Referansla ilişkili yerel bellek, sahne kaldırıldığında veya belleğin bağlı olduğu GameObject ya da üst öğelerinden herhangi biri Destroy()
yöntemiyle yok edildiğinde serbest bırakılır. Ancak, Scene veya GameObject'e yapılan diğer referanslar temizlenmediyse yönetilen bellek Leaked Shell Object olarak kalabilir. Yönetilen kabuk nesneleri hakkında daha fazla bilgi için Yönetilen Kabuk Nesneleri kılavuzuna bakın.
Ayrıca, bellek sızıntılarına etkinlik abonelikleri, lambda ve kapatmalar, dize birleştirme işlemleri ve havuzlanmış nesnelerin uygunsuz yönetimi de neden olabilir:
- Başlamak için Unity bellek anlık görüntülerini düzgün şekilde karşılaştırmak üzere Bellek sızıntılarını bulma başlıklı makaleyi inceleyin.
- Etkinlik aboneliklerini ve bellek sızıntılarını kontrol edin. Nesneler, olaylara abone oluyorsa (ör. temsilciler veya UnityEvents aracılığıyla) ancak yok edilmeden önce aboneliklerini düzgün şekilde iptal etmiyorsa olay yöneticisi veya yayıncı, bu nesnelere referansları koruyabilir. Bu durum, söz konusu nesnelerin çöp toplama işlemine tabi tutulmasını engelleyerek bellek sızıntılarına yol açar.
- Nesne yok edildiğinde kaydı silinmeyen genel veya tekil sınıf etkinliklerini izleyin. Örneğin, nesne yok edicilerde temsilcilerin aboneliğini iptal etme veya bağlantısını kaldırma.
- Havuzdaki nesnelerin yok edilmesinin, metin ağı bileşenleri, dokular ve üst GameObjects'e yapılan referansları tamamen geçersiz kıldığından emin olun.
- Unity Memory Profiler anlık görüntülerini karşılaştırırken ve net bir neden olmaksızın bellek tüketiminde fark gözlemlerken bu farkın grafik sürücüsünden veya işletim sisteminden kaynaklanabileceğini unutmayın.
Bellek parçalanması
Bellek parçalanması, birçok küçük tahsisin rastgele bir sırayla serbest bırakılmasıyla oluşur. Yığın ayırmaları sırayla yapılır. Bu nedenle, önceki yığın alanı tükendiğinde yeni bellek yığınları oluşturulur. Bu nedenle, yeni nesneler eski parçaların boş alanlarını doldurmaz ve parçalanmaya yol açar. Ayrıca, büyük geçici ayırmalar, oyun oturumu süresince kalıcı parçalanmaya neden olabilir.
Bu sorun, özellikle kısa ömürlü büyük tahsisler uzun ömürlü olanların yakınına yapıldığında daha da belirginleşir.
Tahsisleri kullanım ömürlerine göre gruplandırın. İdeal olarak, uzun ömürlü tahsisler uygulamanın yaşam döngüsünün başlarında birlikte yapılmalıdır.
Gözlemciler ve etkinlik yöneticileri
- (Bellek Sızıntıları)77 bölümünde belirtilen soruna ek olarak, zaman içinde bellek sızıntıları, artık kullanılmayan nesnelere ayrılan belleği boş bırakarak parçalanmaya katkıda bulunabilir.
- Havuzdaki nesnelerin yok edilmesinin, metin ağı bileşenleri, dokular ve üst
GameObjects
öğesine yapılan referansları tamamen geçersiz kıldığından emin olun. - Etkinlik yöneticileri, etkinlik aboneliklerini yönetmek için genellikle listeler veya sözlükler oluşturup saklar. Bu öğeler çalışma zamanında dinamik olarak büyüyüp küçülürse sık sık bellek ayırma ve bellekten çıkarma işlemleri nedeniyle bellek parçalanmasına neden olabilir.
Kod
- Coroutine'ler bazen bellek ayırır. Bu durum, her seferinde yeni bir IEnumerator bildirmek yerine dönüş ifadesini önbelleğe alarak kolayca önlenebilir.
- Hayalet referansları tutmamak için havuzdaki nesnelerin yaşam döngüsü durumlarını sürekli olarak izleyin.
UnityEngine.Object
Öğeler
- Çok dilli durumlarda tüm yazı tiplerinin önceden yüklenmesini önlemek için metin odaklı oyun deneyimlerinde dinamik yedek sistemler kullanın.
- Öğeleri (ör. dokular ve parçacıklar) türe ve beklenen yaşam döngüsüne göre birlikte düzenleyin.
- Gereksiz kullanıcı arayüzü resimleri ve statik ağlar gibi boşta kalma yaşam döngüsü özelliklerine sahip öğeleri sıkıştırın.
Yaşam boyu değerine dayalı ayırmalar
- Kompakt ayırmalar sağlamak için uygulama yaşam döngüsünün başında uzun ömürlü öğeler ayırın.
- Bellek yoğun veya geçici veri yapıları (ör. fizik kümeleri) için NativeCollections veya özel ayırıcılar kullanın.
Kodla ilgili ve yürütülebilir dosyalarla ilgili bellek işlemi
Oyunun çalıştırılabilir dosyası ve eklentiler de bellek kullanımını etkiler.
IL2CPP meta verileri
IL2CPP, derleme sırasında her tür (ör. sınıflar, genel öğeler ve temsilciler) için meta veriler oluşturur. Bu meta veriler daha sonra yansıtma, tür kontrolü ve diğer çalışma zamanına özgü işlemler için çalışma zamanında kullanılır. Bu meta veriler bellekte saklanır ve uygulamanın toplam bellek kullanımına önemli ölçüde katkıda bulunabilir. IL2CPP'nin meta veri önbelleği, başlatma ve yükleme sürelerine önemli ölçüde katkıda bulunur. Ayrıca IL2CPP, belirli meta veri öğelerini (ör. genel türler veya serileştirilmiş bilgiler) tekilleştirmez. Bu durum, şişirilmiş bellek kullanımına neden olabilir. Bu durum, projede tekrarlanan veya gereksiz tür kullanımıyla daha da kötüleşir.
IL2CPP meta verileri şu şekilde azaltılabilir:
- Yansıtma API'lerinin kullanılmasından kaçının. Bu API'ler, IL2CPP meta veri ayırmalarına önemli ölçüde katkıda bulunabilir.
- Yerleşik paketleri devre dışı bırakma
- Unity 2022'de tam genel paylaşım özelliğini uygulayarak genel öğelerin neden olduğu ek yükü azaltabilirsiniz. Ancak, tahsisleri daha da azaltmak için genel türlerin kullanımını azaltın.
Kod temizleme
Kod temizleme, derlemenin boyutunu küçültmenin yanı sıra bellek kullanımını da azaltır. IL2CPP komut dosyası arka ucuyla derleme yaparken yönetilen ara kod temizleme (varsayılan olarak etkinleştirilir) yönetilen derlemelerdeki kullanılmayan kodu kaldırır. Bu süreçte, kök derlemeler tanımlanır ve ardından bu kök derlemelerin kullandığı diğer yönetilen kodları belirlemek için statik kod analizi kullanılır. Ulaşılamayan tüm kodlar kaldırılır. Yönetilen kod temizleme hakkında daha fazla bilgi için TTales from the optimization trenches: Better managed code stripping with Unity 2020 LTS başlıklı blog yayınını ve Yönetilen kod temizleme dokümanını inceleyin.
Yerel ayırıcılar
Bellek ayırıcıları hassas bir şekilde ayarlamak için yerel bellek ayırıcılarla denemeler yapın. Oyunun belleği azsa daha yavaş ayırıcılar kullanmayı gerektirse bile daha küçük bellek blokları kullanın. Daha fazla bilgi edinmek için Dinamik yığın ayırıcı örneği konusuna bakın.
Yerel eklentileri ve SDK'ları yönetme
Sorunlu eklentiyi bulun: Her eklentiyi kaldırın ve oyun belleği anlık görüntülerini karşılaştırın. Bu işlemde, Scripting Define Symbols ile birçok kod işlevi devre dışı bırakılır ve arayüzlerle yüksek oranda bağlı sınıflar yeniden düzenlenir. Oyununuzun oynanamaz hale gelmesini önleyerek harici bağımlılıkları devre dışı bırakma sürecini kolaylaştırmak için Oyun programlama kalıplarıyla kodunuzu geliştirin başlıklı makaleyi inceleyin.
Eklenti veya SDK yazarıyla iletişime geçin: Eklentilerin çoğu açık kaynaklı değildir.
Eklenti bellek kullanımını yeniden üretin: Bellek ayırmaları yapan basit bir eklenti yazabilirsiniz (referans olarak bu Unity eklentisini kullanın). Android Studio'yu kullanarak bellek anlık görüntülerini inceleyin (Unity bu ayırmaları izlemez) veya aynı projede
MemoryInfo
sınıfını veRuntime.totalMemory()
yöntemini çağırın.
Unity eklentisi, Java ve yerel bellek ayırır. Bunu yapmak için aşağıdaki adımları uygulayın:
Java
byte[] largeObject = new byte[1024 * 1024 * megaBytes];
list.add(largeObject);
Yerel
char* buffer = new char[megabytes * 1024 * 1024];
// Random data to fill the buffer
for (int i = 1; i < megabytes * 1024 * 1024; ++i) {
buffer[i] = 'A' + (i % 26); // Fill with letters A-Z
}