Unity oyununuzdaki LMK'ları çözmek sistematik bir süreçtir:
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şlevlerden 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, bellek C# ile yerel kod arasında paylaşı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 örneğin 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#'a 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ı 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 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ğrulamak, daha iyi analizler elde etmenizi sağlayacak bir diğer stratejidir.
Öğeleri yönetin
Bu, bellek tüketiminin en etkili ve üzerinde işlem yapılabilir 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'de 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:
ASTC biçimleriyle dokuları sıkıştırarak bellek ayak izini küçültün ve 8x8 gibi daha yüksek bir blok oranıyla denemeler yapın.
ETC2 kullanılması gerekiyorsa dokularınızı Atlas'a yerleştirin. 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'deki önceden yüklenmiş gölgelendiricilerin büyük bellekte kapladığı yeri 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 derleme süreleri ve bellek kullanımında iyileştirmeler) başlıklı blog yayınını inceleyin.
MaterialPropertyBlocksözelliğinden yararlanarak materyal ö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
AudioClipreferansları kaldırın. - Ses verilerini önceden yükleyin. Çalışma zamanında veya sahne başlatılırken 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 Animator Controller'ı 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ü animasyonları kullanın.
Yalnızca bir animasyon bileşeninin ekli veya etkin olduğundan emin olun. Örneğin, Animator kullanıyorsanız Legacy animation 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 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 eklenir. 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.
InstantiateveDestroysimgelerini küçültmek hem CPU performansını hem de bellek kararlılığını artırır. - Öğeleri kaldırma:
- Öğeleri, açılış ekranları veya yükleme ekranları gibi daha az kritik anlarda 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.
- Sürekli olarak Resources.UnloadUnusedAssets kullanmak yerine sahneleri yeniden yapılandırı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 belleği boşaltır.
- 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 referans olmaması koşuluyla dokuyu, ağı ve öğe belleğini temizler.
AssetBundleveyaAddressable: 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çinAddressablesbaşlıklı makaleyi inceleyin.Merkezi paylaşılan bağımlılıklar: Gölgelendiriciler, dokular ve yazı tipleri gibi paylaşılan bağımlılıkları özel paketler veya
Addressablegruplar halinde sistematik olarak gruplandırın. Bu, tekrarları azaltır ve gereksiz öğelerin verimli bir şekilde kaldırılmasını sağlar.Bağımlılık izleme için
Addressableskullanı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 uygun 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- OyununuzunAddressablesveAssetBundles, oyuncuyla aynı Unity sürümü kullanılarak oluşturulup dağıtılıyorsa ve diğer oyuncu derlemeleriyle geriye dönük uyumluluk gerektirmiyorsaTypeTreeyazmayı devre dışı bırakmayı düşünebilirsiniz. Bu işlem, paket boyutunu ve seri hale getirilmiş dosya nesnesi bellekte kaplanan yerini azaltır. Yerel Addressables paket ayarındaki ContentBuildFlags bölümünde derleme işlemini 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.
- Değiştirilebilir dizeler için dize birleştirme yerine
StringBuilderkullanı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ü kanvas güncellemelerini yönetme:
- Kullanıcı arayüzü öğelerinde yapılan dinamik değişiklikler: Metin, resim veya
RectTransformgibi kullanıcı arayüzü öğeleri güncellendiğinde (ör. metin içeriği değiştirildiğinde, öğeler yeniden boyutlandırıldığı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 genellikle dize güncellemeleri gerektirir. Bunun nedeni, dizelerin çoğu programlama dilinde değişmez olmasıdır.
- Kirli kanvas: Bir kanvastaki bir şey değiştiğinde (ör. 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 işlemine 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 karmaşıklığına yol açabilir.
- 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 bellekte kaplanan yeri iyileştirip iyileştirmediğini doğrulamak için profilleme yapın.
Oyununuz kontrollü bir yaklaşım gerektiriyorsa atık toplama modunu manuel olarak ayarlayın. Ardından, seviye değişikliğinde veya aktif oyun oynanmayan başka bir anda atık 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ı tetikleyin.
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 bir ş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 etkinliklere abone olursa (örneğin, temsilciler veya UnityEvents aracılığıyla) ancak yok edilmeden önce aboneliklerini düzgün şekilde iptal etmezlerse etkinlik 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 edilmesi, metin ağı bileşenlerine, dokulara ve üst GameObject'lere yapılan referansları tamamen geçersiz kılar.
- Unity Memory Profiler anlık görüntülerini karşılaştırırken ve net bir nedeni olmamasına rağmen bellek tüketiminde farklılık gözlemlerken bu farklılığı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.
Grup tahsislerini kullanım ömürlerine göre yapı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ı 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
GameObjectsile ilgili 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 IEnumerator'ın dönüş ifadesini önbelleğe alarak kolayca önlenebilir.
UnityEngine.ObjectHayalet referansları tutmamak için havuzdaki nesnelerin yaşam döngüsü durumlarını sürekli olarak izleyin.
Öğ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.
- Boşta kalma ömrü özelliklerine sahip öğeleri (ör. gereksiz kullanıcı arayüzü resimleri ve statik ağlar) sıkıştırın.
Yaşam boyu değerine dayalı dağıtımlar
- 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 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 veri 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 bellekte kaplanan yerine ö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ğinin uygulanması, genel öğelerin neden olduğu ek yükü azaltmaya yardımcı olmalıdır. 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 Optimizasyon siperlerinden hikayeler: Unity 2020 LTS ile daha iyi yönetilen kod temizleme 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şlem, Scripting Define Symbols ile birçok kod işlevinin devre dışı bırakılmasını ve arayüzlerle yüksek oranda bağlı sınıfların yeniden düzenlenmesini içerir. 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ştirme 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
MemoryInfosı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
}