Unity için performans önerileri

Unity’de karma gerçeklik uygulamalarının performansını iyileştirmenin en önemli ilk adımı, Unity için önerilen ortam ayarlarını kullanmaya dikkat etmektir. Bu makalede, yüksek performansa sahip Karma Gerçeklik uygulamaları oluşturmanın en önemli sahne yapılandırmalarından bazılarına sahip içerikler yer almaktadır. Bu önerilen ayarlardan bazıları da aşağıda vurgulanmıştır.

Unity ile profil oluşturma

Unity, belirli bir uygulama için değerli performans içgörüleri toplamak için harika bir kaynak olan Unity Profiler yerleşik uygulamasını sağlar. Profil işleyiciyi düzenleyicide çalıştırabilirsiniz ancak bu ölçümler gerçek çalışma zamanı ortamını temsil etmese de sonuçların dikkatli bir şekilde kullanılmalıdır. En doğru ve eyleme değiştirilebilir içgörüler için cihazda çalışırken uygulamanın profilini uzaktan oluşturmanızı öneririz. Ayrıca Unity’nin Çerçeve Hata Ayıklayıcısı da güçlü ve içgörü aracıdır.

Unity, aşağıdakiler için harika belgeler sağlar:

  1. Unity profilleyiciyi UWP uygulamalarına uzaktan bağlama
  2. Unity Profiler ile performans sorunlarını etkili bir şekilde tanılama

 Not

Unity Profiler bağlı ve GPU profilleyicisini ekledikten sonra (sağ üst köşedeki ProfilLeyici Ekleme’ye bakın), profil oluşturmanın ortasında sırasıyla CPU GPU’da ne kadar süre harcanıyor olduğunu görebilir. Bu, uygulama CPU veya GPU sınırlandı ise geliştiricinin hızlı bir yaklaşık değeri elde ed işlemesini sağlar.

Unity CPU ile GPU karşılaştırması

CPU performans önerileri

Aşağıdaki içerik, özellikle Unity C# geliştirmesi için hedeflenen daha ayrıntılı & performans uygulamalarını kapsar.

Önbellek başvuruları

GetComponent () ve Camera.main gibi işlev çağrılarını yinelemek, işaretçiyi depolamak için bellek maliyetine göre daha pahalı olduğundan, başlatma sırasında tüm ilgili bileşenlere ve GameObjects’e başvurular önbelleğe alınmasını öneririz. . Camera.main yalnızca altında FindGameObjectsWithTag() kullanır ve bu da “MainCamera” etiketine sahip bir kamera nesnesi için sahne grafını pahalı bir şekilde arar.CSKopyala

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
    private Camera cam;
    private CustomComponent comp;

    void Start() 
    {
        cam = Camera.main;
        comp = GetComponent<CustomComponent>();
    }

    void Update()
    {
        // Good
        this.transform.position = cam.transform.position + cam.transform.forward * 10.0f;

        // Bad
        this.transform.position = Camera.main.transform.position + Camera.main.transform.forward * 10.0f;

        // Good
        comp.DoSomethingAwesome();

        // Bad
        GetComponent<CustomComponent>().DoSomethingAwesome();
    }
}

 Not

GetComponent’den kaçının(dize)
GetComponent() kullanırkenbirkaç farklı aşırı yükleme vardır. Tür tabanlı uygulamaları her zaman kullanmak ve dize tabanlı arama aşırı yüklemesini hiçbir zaman kullanmak önemlidir. Sahneniz içinde dizeye göre arama, Türe göre aramadan çok daha maliyetlidir.
(İyi) Bileşen GetComponent(Tür türü)
(İyi) T GetComponent < T > ()
(Hatalı) Bileşen GetComponent(dize)>

Pahalı işlemlerden kaçının

  1. LINQ kullanımından kaçınınLINQ temiz ve okuması kolay olsa da, genellikle algoritmayı el ile yazmadan daha fazla hesaplama ve bellek gerektirir.CSKopyala// Example Code using System.Linq; List<int> data = new List<int>(); data.Any(x => x > 10); var result = from x in data where x > 10 select x;
  2. Ortak Unity API’leriBazı Unity API’leri kullanışlı olsa da yürütülse de pahalı olabilir. Bunların çoğu, tüm sahne grafındaki eşleşen GameObjects listesini aramanızı içerir. Bu işlemler genellikle başvuruları önbelleğe alma veya GameObjects için çalışma zamanında başvuruları izlemek için bir yönetici bileşeni uygulanarak engel olabilir.C#Kopyala GameObject.SendMessage() GameObject.BroadcastMessage() UnityEngine.Object.Find() UnityEngine.Object.FindWithTag() UnityEngine.Object.FindObjectOfType() UnityEngine.Object.FindObjectsOfType() UnityEngine.Object.FindGameObjectsWithTag() UnityEngine.Object.FindGameObjectsWithTag()

 Not

SendMessage() ve BroadcastMessage() tüm maliyetler ortadan kaldırılacaktır. Bu işlevler, doğrudan işlev çağrılarının sırasına göre 1000 kat daha yavaş olabilir.

  1. Boxing’e dikkat edinBoxing, C# dili ve çalışma zamanı için temel bir kavramdır. , , vb. gibi değer türüne sahip değişkenleri başvuru türüne sahip charintbool değişkenlere sarmalama işlemidir. Değer türüne sahip bir değişken “kutulanmış” olduğunda, yönetilen yığında depolanan bir System.Object içine sarmalar. Bellek ayrılır ve sonunda atılması gereken zaman atık toplayıcı tarafından işlenmeli. Bu ayırmalar ve ayırmalar bir performans maliyetine neden olur ve birçok senaryoda gereksizdir veya daha ucuz bir alternatifle kolayca değiştirilebilir.Kutulamanın önüne geçerek sayısal türleri ve yapılarını depolayanın değişkenlerin, alanların ve özelliklerin (dahil) nesne kullanmak yerine , veya gibi belirli türler olarak yazılması Nullable<T>intfloat?MyStruct gerekir. Bu nesneleri bir listeye alıyorsanız, veya yerine gibi kesin olarak türü kesin olarak girilen bir List<int> liste kullanmaya emin List<object>ArrayList olun.C’de kutulama örneği #C#Kopyala// boolean value type is boxed into object boxedMyVar on the heap bool myVar = true; object boxedMyVar = myVar;

Kod yollarını yineleme

Saniye başına ve/veya çerçevede birçok kez yürütülen tüm yinelenen Unity geri çağırma işlevleri (yani Update) dikkatli bir şekilde yazmalıdır. Buradaki pahalı işlemlerin performans üzerinde büyük ve tutarlı bir etkisi olur.

  1. Boş geri çağırma işlevleriAşağıdaki kod, özellikle de her Unity betiği bir Update yöntemiyle otomatik olarak başlatılacağı için uygulamanıza bırakmak zor görünse de, bu boş geri çağırmalar pahalıya görünebilir. Unity, UnityEngine kodu ile uygulama kodunuz arasında yönetilemeyen ve yönetilen bir kod sınırı arasında ileri ve geri çalışır. Yürütülecek bir şey yoksa bile bu köprü üzerinden bağlam değiştirme oldukça pahalıdır. Bu durum özellikle, uygulamanıza Unity geri çağırmalarını tekrarlayan boş bileşenlere sahip 100’lerlik GameObjects varsa sorunlu hale gelir.CSKopyalavoid Update() { }

 Not

Update() bu performans sorununa en sık rastlanan sorundur, ancak aşağıdakiler gibi yinelenen Unity geri çağırmaları da aynı derecede kötü olabilir: FixedUpdate(), LateUpdate(), OnPostRender”, OnPreRender(), OnRenderImage() vb.

  1. Çerçeve başına bir kez çalıştırmayı tercih etmek için işlemlerAşağıdaki Unity API’leri birçok Holographic Apps için yaygın işlemlerdir. Her zaman mümkün olsa da, bu işlevlerin sonuçları genellikle bir kez hesaplanmış ve sonuçlar uygulama genelinde belirtilen bir çerçeve için yeniden kullanılabilir.a) Raycast’inizi sahnede işlemek için ayrılmış bir Singleton sınıfına veya hizmetine sahip olmak ve ardından bu sonucu her bileşen tarafından yinelenen ve aynı Raycast işlemleri yapmak yerine diğer tüm sahne bileşenlerinde yeniden kullanmak iyi bir uygulamadır. Bazı uygulamalar farklı kaynaklardan veya farklı LayerMask’lara karşı yayın gerektirir.C#Kopyala UnityEngine.Physics.Raycast() UnityEngine.Physics.RaycastAll() b) Start() veya Awake() içinde başvuruları önbelleğe almak için Update() gibi yinelenen Unity geri çağırmalarında GetComponent() işlemlerden kaçınınC#Kopyala UnityEngine.Object.GetComponent() c) Mümkünse, başlatma sırasında tüm nesnelerin örneğini oluşturma ve nesne havuzu kullanarak GameObjects’i uygulamanın çalışma zamanı boyunca geri dönüştürme ve yeniden kullanma iyi bir uygulamadırC#Kopyala UnityEngine.Object.Instantiate()
  2. Arabirimlerden ve sanal yapılardan kaçınınİşlev çağrılarını arabirimler ve doğrudan nesneler aracılığıyla çağırma veya sanal işlevleri çağırma genellikle doğrudan yapıları veya doğrudan işlev çağrılarını kullanmaya göre çok daha pahalı olabilir. Sanal işlev veya arabirim gereksizse kaldırılmalıdır. Ancak, bu yaklaşımların performansı, bunları kullanmanın geliştirme işbirliğini, kod okunabilirliğini ve kod sürdürülebilirliğini basitleştirmesini kolaylaştırıyorsa, bu yaklaşımların performansının düşük olduğu bir değerdir.Genel olarak, bu üyenin üzerine yazılacak net bir beklenti olmadığı sürece alanları ve işlevleri sanal olarak işaretlemeniz önerildi. Bir yöntem gibi çerçeve başına birçok kez, hatta çerçeve başına bir kez çağrılarak yüksek frekanslı kod yolları konusunda özellikle dikkatli UpdateUI() olunması gerekir.
  3. Yapıları değere göre geçirmeyi önlemeSınıfların aksine, yapılar değer türleridir ve doğrudan bir işleve geçirildiklerinde içerikleri yeni oluşturulan bir örneğine kopyalanır. Bu kopya cpu maliyetinin yanı sıra yığında ek bellek ekler. Küçük yapılarda etki minimum düzeydedir ve bu nedenle kabul edilebilir. Ancak, her karede tekrar tekrar çağrılan işlevlerin yanı sıra büyük yapılar alan işlevler için mümkünse işlev tanımını başvuruya göre geçecek şekilde değiştirebilirsiniz. Daha fazla bilgi için buraya tıklayın

Çeşitli

  1. Fizika) Genellikle fiziği geliştirmenin en kolay yolu, Fizik için harcanan zamanı veya saniye başına yineleme sayısını sınırlamaktır. Bu, simülasyon doğruluğunu azaltır. Bkz. Unity’de TimeManagerb) Unity’de harmanlama türleri büyük ölçüde farklı performans özelliklerine sahiptir. Aşağıdaki sıra, soldan sağa en az performansa neden olan colliders’a en iyi performansı sergilemektedir. İlkel harmanlamalardan çok daha pahalı olan Mesh Colliders’dan kaçınmak önemlidir.Sphere < Capsule Box Mesh <<<< (Convex) < Mesh (Convex olmayan)Daha fazla bilgi için bkz. Unity Fizik En İyi Yöntemleri
  2. AnimasyonlarAnimator bileşenini devre dışı bırakarak boşta animasyonları devre dışı bırakma (oyun nesnesini devre dışı bırakmak aynı etkiye sahip olmaz). Bir animasyonu bir döngüde yer alan ve bir değeri aynı şey olarak ayaran tasarım desenlerini önle. Bu teknik için önemli bir ek yük vardır ve uygulama üzerinde hiçbir etkisi yoktur. Burada daha fazla bilgi edinebilirsiniz.
  3. Karmaşık algoritmalarUygulamanız ters kinematik, yol bulma gibi karmaşık algoritmalar kullanıyorsa, daha basit bir yaklaşım bulmak veya performansları için ilgili ayarları ayarlamak için bakın

CPU’den GPU’ya performans önerileri

Genellikle, CPU-GPU performansı, grafik kartına gönderilen Çizim çağrılarına gelir. Performansı artırmak için, en iyi sonuçlar için yeniden yapılandırılmış olan çizim çağrılarının, azaltılmış veya b)azaltılmasına gerek kalmaz. Çizim çağrılarına kaynak kullanımı yoğun olduğundan, bunları azaltmak gereken genel işi azaltır. Ayrıca, çizim çağrıları arasındaki durum değişiklikleri grafik sürücüde maliyetli doğrulama ve çeviri adımları gerektirir ve bu nedenle, uygulamanızın durum değişikliklerini sınırlamaya yönelik çizim çağrılarını yeniden (farklı malzemeler, vb.) yeniden yapılandırma performansı artırabilir.

Unity ‘nin, bir genel bakış sunan harika bir makaleye sahiptir ve bunların platformu için toplu olarak çizim çağrılarını ele alır.

Tek pass ınstanced oluşturma

Unity ‘de tek geçiren bir Işleme, her bir gözle, bir tek bir çizim çağrısına indirgenecek çizim çağrılarına izin verir. İki çizim çağrısı arasındaki önbellek bütünlüğü nedeniyle, GPU üzerinde de bazı performans geliştirmesi de vardır.

Unity Project bu özelliği etkinleştirmek için

  1. player xr Ayarlar ‘yi açın (Project düzenleAyarlarplayerxr Ayarlar)
  2. Stereo Işleme yöntemi açılan menüsünden Tekli geçiş ‘ i seçin (sanal gerçeklik desteklenen onay kutusu işaretli olmalıdır)

Bu işleme yaklaşımına ilişkin ayrıntılar için Unity ‘den aşağıdaki makaleleri okuyun.

 Not

Tek geçişli bir Işleme ile ilgili yaygın bir sorun, geliştiricilerin örnek oluşturmak için yazılmayan özel gölgelendiriciler zaten varsa oluşur. Bu özellik etkinleştirildikten sonra, geliştiriciler bazı GameObjects ‘in yalnızca bir göz içinde işlemesini fark edebilir. Bunun nedeni, ilişkili özel gölgelendiricilerin örnek oluşturma için uygun özelliklere sahip olmaması olabilir.

bu sorunun nasıl ele alınacağını öğrenmek için bkz. Unity ‘den HoloLens için tek geçişli Stereo işleme

Statik toplu işlem

Unity, GPU ‘ya yönelik çizim çağrılarını azaltmak için birçok statik nesne toplu işlem yapabilir. Statik toplu işlem, Unity ‘de 1) aynı malzemeyi paylaşan ve 2) tamamen statik olarak işaretlenmiş (Unity ‘de bir nesne seçin ve Inspector ‘ın sağ üst köşesindeki onay kutusunu seçin). Statik olarak Işaretlenen gameobjects, uygulamanızın çalışma zamanı boyunca taşınamaz. bu nedenle, statik toplu işleme, neredeyse her nesnenin yerleştirilmesi, taşınması, ölçeklendirilmesi gereken HoloLens ‘ten yararlanmak zor olabilir. Tam ekran kulaklıklar için, statik toplu işlem çizim çağrılarını önemli ölçüde azaltabilir ve bu sayede performansı geliştirir.

Daha fazla ayrıntı için Unity ‘de toplu çağrı toplu Işi çiz bölümünde statik toplu işlem okuyun.

Dinamik toplu işleme

HoloLens geliştirme için nesneleri statik olarak işaretlemek sorunlu olduğundan, dinamik toplu işlem bu olmayan bu özelliği dengelemek için harika bir araç olabilir. Ayrıca, modern kulaklıklar de yararlı olabilir. Ancak, Unity ‘de dinamik toplu işlem, GameObjects ‘in aynı malzemeyi paylaşmaları ve b) diğer ölçütlere ait uzun bir liste ile buluşılmasıgerektiğinden etkinleştirilebilir.

Tam liste için Unity ‘de çizim çağrısı toplu işi ‘ nin altındaki dinamik toplu işlemeyi okuyun. En yaygın olarak, GameObjects, ilişkili ağ verileri 300 köşelerden fazla olmadığı için dinamik olarak toplu olarak geçersiz hale gelir.

Diğer teknikler

Toplu işleme yalnızca birden fazla GameObjects aynı malzemeleri paylaşabiliyor ise gerçekleşebilir. Genellikle, bu, oyun nesnelerinin ilgili malzemelerde benzersiz bir dokusunu olması gereği tarafından engellenir. Dokuları DokAtlasingolarak bilinen bir büyük dokuyla birleştirmek yaygın bir yöntemdir.

Ayrıca, kafeslerin mümkün ve makul yerlerde tek bir oyun nesnesi halinde birleştirmek tercih edilir. Unity ‘deki her Işleyicide, ilişkili çizim çağrılarıyla birlikte bir Oluşturucu altında Birleşik bir ağ gönderilmesi gerekir.

 Not

Çalışma zamanında Oluşturucu. malzemenin özelliklerinin değiştirilmesi malzemenin bir kopyasını oluşturur ve bu sayede toplu işi kesebilir. Oyun nesneleri genelinde paylaşılan malzeme özelliklerini değiştirmek için Renderer. Sharedmalzemesini kullanın.

GPU performans önerileri

Unity ‘de grafik işlemeyi iyileştirme hakkında daha fazla bilgi edinin

Derinlik arabelleği paylaşımını iyileştirme

hologram kararlılığınıiyileştirmek için Player xr Ayarlar kapsamında derinlik arabelleği paylaşımının etkinleştirilmesi önerilir. Bu ayar ile derinlik tabanlı geç aşama yeniden projeksiyonunu etkinleştirirken, 24 bit derinlik biçimiyerine 16 bit derinlik biçimini seçmeniz önerilir. 16 bit derinlik arabellekleri, derinlik arabelleği trafiğiyle ilişkili bant genişliğini (ve bu nedenle güç) büyük ölçüde azaltır. Bu, hem güç azaltma hem de performans geliştirmesine karşı büyük bir kazanç olabilir. Ancak, 16 bit derinlik biçimikullanılarak iki olası negatif sonuç vardır.

Z-Fighting

Düşük Derinlik aralığı doğruluğu, 24 bit ‘den 16 bit ile, büyük olasılıkla daha fazla durum oluşmasına neden olur. Bu yapıtları önlemek için, Unity kameranın yakın/en küçük düzlemlerini daha düşük duyarlık için hesaba göre değiştirin. HoloLens tabanlı uygulamalarda, Unity varsayılan 1000 8 yerine 50 milyon olan en küçük bir düzlemi, her türlü z-fighi ortadan kaldırabilir.

Devre dışı kalıp arabelleği

Unity, 16 bit derinlikli bir Işleme dokusuoluşturduğunda, oluşturulan kalıp arabelleği yoktur. Unity belgeleri başına 24 bit derinlik biçimi seçme, bir 24 bit z arabelleği ve bir [8 bit kalıp arabelleği] () ve bir https://docs.unity3d.com/Manual/SL-Stencil.html cihaz üzerinde 32 bitlik uygulanabilir ise, genellikle HoloLens gibi bir durum oluşturur.

Tam ekran efektlerinden kaçının

Tam ekran üzerinde çalışan teknikler, büyüklük sırası her karede milyonlarca işlem olduğundan pahalı olabilir. Kenar yumuşatma, Bloom ve daha fazlası gibi işlem sonrası etkileri olmaması önerilir.

En iyi aydınlatma ayarları

Unity ‘de gerçek zamanlı küresel aydınlatma , bekleyen görsel sonuçları sağlayabilir ancak pahalı aydınlatma hesaplamaları içerir. pencereişleme aydınlatma aracılığıyla her Unity sahne dosyası için gerçek zamanlı küresel aydınlatmayı devre dışı bırakmayı öneririz Ayarlar gerçek zamanlı küresel aydınlatmayıkaldırın.

Ayrıca, ayrıca bir Unity sahneye pahalı GPU geçişleri de ekleyerek tüm gölge atama devre dışı bırakılması önerilir. Gölgelerin her ışık için devre dışı bırakılması, ancak kalite ayarları aracılığıyla barındırıda denetlenebilir.

DüzenleProject Ayarlar, ardından, UWP platformu için düşük kalite ‘ yi seçerek kalite kategorisini seçin. Ayrıca, gölgeler özelliğinigölgeleri devre dışı bırakmakiçin de ayarlayabilirsiniz.

Unity ‘de modellerinizde kullanıma yönelik aydınlatma kullanmanızı öneririz.

Poly sayısını azalt

Çokgen sayısı, her biri tarafından azaltılır

  1. Sahneden nesneleri kaldırma
  2. Belirli bir ağ için poligonun sayısını azaltan varlık yok etme
  3. Uygulamanıza aynı geometriyi daha düşük Çokgen sürümü ile çok fazla nesne oluşturan bir ayrıntı düzeyi (LOD) sistemi uygulama

Unity ‘de gölgelendiriciler anlama

Performanslarında gölgelendiricilerin karşılaştırılacağı kolay bir performans, her birinin çalışma zamanında yürütülen ortalama işlem sayısını belirlemektir. Bu, Unity ‘de kolayca yapılabilir.

  1. Gölgelendirici varlığınızı seçin veya bir malzeme seçin, sonra Inspector penceresinin sağ üst köşesindeki dişli simgesini ve ardından “gölgelendirici Seç” i seçinUnity 'de gölgelendirici seçin
  2. Gölgelendirici varlığı seçili olduğunda Inspector penceresinin altındaki “kodu derle ve göster” düğmesini seçinUnity 'de gölgelendirici kodu derleme
  3. Derlendikten sonra, her iki köşe ve piksel gölgelendiricisi için farklı işlem sayısıyla sonuçlarda istatistik bölümünü arayın (Note: Piksel gölgelendiricileri genellikle parça gölgelendiriciler olarak da adlandırılır)Unity standart gölgelendirici Işlemleri

Piksel gölgelendiricileri iyileştirin

Yukarıdaki yöntemi kullanarak derlenmiş istatistik sonuçlarına bakarak, parça gölgelendirici genellikle köşe gölgelendiricidendaha fazla işlemi ortalama olarak yürütür. Köşe gölgelendiricisi yalnızca ekrana çizilmekte olan tüm kafeslerin her köşesinde yürütüldüğünde, piksel gölgelendiricisi olarak da bilinen parça gölgelendiricisi, ekran çıkışında her piksel için yürütülür.

Bu nedenle, yalnızca parça gölgelendiricilerin, tüm aydınlatma hesaplamaları nedeniyle köşe gölgelendiricileriyle daha fazla yönerge yoktur, parça gölgelendiriciler neredeyse her zaman daha büyük bir veri kümesinde yürütülür. Örneğin, ekran çıktısı 2k tarafından bir 2k Image tarafından kullanılıyorsa, parça gölgelendirici, çalıştırılabilir 2000 * 2000 = 4.000.000 kez alabilir. İki gözyi işliyorsa, iki ekran olduğundan bu sayı iki katına çıkar. Bir karma gerçeklik uygulamasının birden çok geçişi varsa, tam ekran işlem sonrası etkileri varsa veya birden çok kafesi aynı pikselde işliyorsa bu sayı önemli ölçüde artar.

Bu nedenle, parça gölgelendiricide işlem sayısını azaltmak, genellikle köşe gölgelendiricide iyileştirmelere göre daha fazla performans artışı sağlayabilir.

Unity standart gölgelendirici alternatifleri

Fiziksel tabanlı işleme (PBR) veya başka bir yüksek kaliteli gölgelendirici kullanmak yerine, daha performanslı bir gölgelendirici kullanmaktan daha fazla bilgi. Karma gerçeklik araç seti , karma gerçeklik projeleri için optimize edilmiş mrtk standart gölgelendiriciyi sağlar.

Unity Ayrıca, Unity standart gölgelendiricisine kıyasla daha hızlı bir şekilde, daha hızlı, köşe aydınlatmalı, dağıtılmış ve diğer Basitleştirilmiş gölgelendirici seçenekleri de sağlar. Daha ayrıntılı bilgi için bkz. yerleşik gölgelendiricilerin kullanımı ve performansı .

Gölgelendirici önyüklemesi

Gölgelendirici yükleme süresiniIyileştirmek için gölgelendirici önyüklemesi ve diğer püf noktalarını kullanın. Özellikle, gölgelendirici önceden yükleme, çalışma zamanı gölgelendirici derlemesi nedeniyle herhangi bir aksaklık görmeyeceğiniz anlamına gelir.

Fazla çizimi sınırla

Unity ‘de, sahne görünümü ‘ nin sol üst köşesindeki çizim modu menüsünü değiştirerek ve fazla çizim‘ i seçerek, bir diğeri sahnenin üzerine fazla çizim gösterebilir.

Genel olarak, aşırı çizim, nesneleri GPU ‘ya gönderilmeden önce zaman önplanlayarak azaltılabilir. Unity, motoru için Occlusiyon yüzey uygulama hakkında ayrıntılar sağlar.

Bellek önerileri

Aşırı bellek ayırma & ayırmayı kaldırma işlemleri, Holographic uygulamanızda olumsuz etkilere neden olabilir, bu da tutarsız performans, dondurulmuş çerçeveler ve diğer daha fazla davranış oluşmasına yol açabilir. Bellek yönetimi çöp toplayıcı tarafından denetlendiğinden, Unity ‘de geliştirme yaparken bellek konularını anlamak özellikle önemlidir.

Atık toplama

GC, yürütme sırasında kapsamda olmayan nesneleri analiz etmek için etkinleştirildiğinde ve bellek serbest bırakılması gerektiğinden, yeniden kullanım için kullanılabilir hale getirilebilir, Holographic uygulamalar işlem süresini çöp toplayıcıya (GC) işleme süresini kaybedecektir. Sabit ayırmalar ve serbest ayırmalar, genellikle Atık toplayıcısının daha sık çalışmasını gerektirir, bu nedenle performans ve Kullanıcı deneyimi de çok daha fazla çalışır.

Unity, çöp toplayıcının nasıl çalıştığına ve bellek yönetimine göre daha verimli kod yazma ipuçlarına ilişkin ayrıntılı bilgiler sunan harika bir sayfa sağladı.

Aşırı atık toplamaya neden olan en yaygın uygulamalardan biri, Unity geliştirmede bulunan bileşenlere ve sınıflara yönelik başvuruları önbelleğe vermez. Tüm başvurular, Start () veya uyanık () sırasında yakalanmalıdır ve Update () veya LateUpdate () gibi sonraki işlevlerde yeniden kullanılır.

Diğer hızlı ipuçları:

  • Çalışma zamanında karmaşık dizeleri dinamik olarak derlemek için StringBuilder C# sınıfını kullanın
  • Bir uygulamanın tüm derleme sürümlerinde yürütülmeye devam ettikleri için, artık gerekli olmadığında hata ayıklama. log () çağrılarını kaldırın
  • Holographic uygulamanız genellikle çok fazla bellek gerektiriyorsa, yükleme veya geçiş ekranı sunarken gibi, yükleme aşamaları sırasında System. GC. Collect () öğesini çağırmayı düşünün

Nesne havuzu oluşturma

Nesne havuzu oluşturma, sürekli nesne ayırma ve ayırma maliyetini azaltmak için popüler bir tekniktir. Bu, aynı nesneler için büyük bir havuz ayırarak ve zaman içinde nesneleri sürekli olarak oluşturmak ve yok etmek yerine bu havuzdan etkin olmayan, kullanılabilir örnekleri yeniden kullanmaya yapılır. Nesne havuzları, bir uygulama sırasında değişken ömrü bulunan yeniden kullanılabilir bileşenler için idealdir.

Başlangıç performansı

Uygulamanızı daha küçük bir sahneye başlattıktan sonra, sahneye geri kalanını yüklemek için Monemanager. Loadmanzara Easync komutunu kullanın. Bu, uygulamanızın mümkün olduğunca hızlı bir şekilde etkileşimli duruma almasına izin verir. Yeni sahne etkinleştirildiğinde büyük bir CPU ani artış olabilir ve tüm işlenmiş içerikler stutter veya Hitch olabilir. Bu sorunu çözmek için bir yol, zaman uyumsuz coperation. Allowmanzara Eactivation özelliğini yüklenmekte olan sahnede “false” olarak ayarlamak, sahnenin yüklenmesini beklemek, ekran için çok siyah bir ekran açmak ve ardından sahneyi “true” olarak yeniden ayarlamak için sahne etkinleştirmeyi tamamlayacak.

Başlangıç sahneyi yüklenirken, kullanıcıya holographic giriş ekranının görüntülendiğini unutmayın.

Kaynak: https://docs.microsoft.com/tr-tr/windows/mixed-reality/develop/unity/performance-recommendations-for-unity


Yorum bırakın