Unity için performans önerileri

Bu makale karma gerçeklik için performans önerilerini ele alır ancak Unity'ye özgü geliştirmelere odaklanır.

Yakın zamanda HoloLens 2 uygulamaları için yaygın performans, tasarım ve ortam sorunlarını ve çözümlerini kapsayan Kalite temelleri adlı bir uygulama yayımladık. Bu uygulama, aşağıdaki içerik için harika bir görsel tanıtımdır.

Unity'de karma gerçeklik uygulamalarının performansını iyileştirmenin en önemli ilk adımı, Unity için önerilen ortam ayarlarını kullandığınızdan emin olmaktır. Bu makale, performans gösteren Karma Gerçeklik uygulamaları oluşturmaya yönelik en önemli sahne yapılandırmalarından bazılarına sahip içerikler içerir. Bu önerilen ayarlardan bazıları aşağıda da vurgulanı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şikini sağlar. Profil oluşturucuyu düzenleyicide çalıştırabilirsiniz ancak bu ölçümler gerçek çalışma zamanı ortamını temsil etmediğinden sonuçların dikkatli bir şekilde kullanılması gerekir. En doğru ve eyleme dönüştürülebilir içgörüler için cihazda çalışırken uygulamanızın profilini uzaktan oluşturmanızı öneririz.

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

  1. Unity profil oluşturucuyu UWP uygulamalarına uzaktan bağlama
  2. Unity Profil Oluşturucu ile performans sorunlarını etkili bir şekilde tanılama

GPU profili oluşturma

Unity profil oluşturucu

Unity Profiler bağlı olduğundan ve GPU profil oluşturucuyu ekledikten sonra (sağ üst köşedeki Profil Oluşturucu Ekleme bölümüne bakın), profil oluşturucunun ortasında sırasıyla CPU & GPU'ya ne kadar zaman harcandığını görebilirsiniz. Bu, geliştiricinin uygulaması CPU veya GPU sınırlanmışsa hızlı bir yaklaşık değer elde etmesini sağlar.

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

Not

GPU profili oluşturmayı kullanmak için Unity Player Ayarları'ndaGrafik İşleri'ni devre dışı bırakmanız gerekir. Diğer ayrıntılar için Unity'nin GPU Kullanım Profili Oluşturucu modülüne bakın.

Unity çerçeve hata ayıklayıcısı

Unity'nin Çerçeve Hata Ayıklayıcı'sı da, kullanılacak güçlü ve içgörü sahibi bir araçtır. Gpu'nun her karede ne yaptığına ilişkin iyi bir genel bakış sağlayacaktır. HoloLens'te bunlar çok pahalı olduğundan dikkate almak gerekenler ek işleme hedefleri ve bunlar arasında kopyalamaya yönelik blit komutlarıdır. İdeal olarak HoloLens'te ekran dışı işleme hedefi kullanılmamalıdır. Bunlar genellikle kaçınılması gereken pahalı işleme özellikleri (örneğin MSAA, HDR veya bloom gibi tam ekran efektleri) etkinleştirilirken eklenir.

HoloLens kare hızı katmanı

Cihaz Portalı Sistem Performansı sayfasında, cihazın CPU ve GPU performansının iyi bir özeti bulunur. Mikrofonlu kulaklıkta Görüntü kare hızı sayacını ve mikrofonlu kulaklıkta kare hızı grafiğini görüntüle'yi etkinleştirebilirsiniz. Bu seçenekler sırasıyla bir FPS sayacını ve grafiği etkinleştirerek cihazınızda çalışan tüm uygulamalarla ilgili anında geri bildirim sağlar.

PİX

PIX , Unity uygulamalarının profilini de almak için kullanılabilir. HoloLens 2 için PIX'i kullanma ve yükleme hakkında ayrıntılı yönergeler de vardır. Geliştirme derlemesinde, Unity'nin Çerçeve Hata Ayıklayıcısı'nda gördüğünüz kapsamlar PIX'de de gösterilir ve daha ayrıntılı bir şekilde incelenip profili oluşturulabilir.

Not

Unity, XRSettings.renderViewportScale özelliği aracılığıyla çalışma zamanında uygulamanızın işleme hedef çözünürlüğünü kolayca değiştirme olanağı sağlar. Cihazda sunulan son görüntü sabit bir çözünürlüğe sahiptir. Platform, ekranlarda işleme için daha yüksek çözünürlüklü bir görüntü oluşturmak için daha düşük çözünürlük çıkışını örnekleyecektir.

UnityEngine.XR.XRSettings.renderViewportScale = 0.7f;

CPU performans önerileri

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

Önbellek başvuruları

GetComponent<T>() ve Camera.main gibi yinelenen işlev çağrıları, bir 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 GameObject'lere yönelik başvuruları önbelleğe almanızı öneririz. . Camera.main yalnızca altında FindGameObjectsWithTag() kullanır ve bu da sahne grafınızdaki "MainCamera" etiketine sahip bir kamera nesnesini pahalıya arar.

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(dize) kullanmaktan kaçının
GetComponent() kullanırken, birkaç farklı aşırı yükleme vardır. Tür tabanlı uygulamaları her zaman kullanmak ve hiçbir zaman dize tabanlı arama aşırı yüklemesini kullanmak önemlidir. Sahnenizdeki dizeye göre arama, Türe göre aramaktan ç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 kullanmaktan kaçının

    LINQ temiz ve kolay okunabilir ve yazılabilir olsa da, genellikle algoritmayı el ile yazdığınızdan daha fazla hesaplama ve bellek gerektirir.

    // 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'leri

    Bazı Unity API'lerinin yürütülmesi yararlı olsa da pahalı olabilir. Bunların çoğu, tüm sahne grafiğinizde GameObjects'in eşleşen bir listesini aramayı içerir. Bu işlemler genellikle başvuruları önbelleğe alarak veya çalışma zamanında başvuruları izlemek üzere GameObjects için bir yönetici bileşeni uygulanarak önlenebilir.

        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() her ne pahasına olursa olsun ortadan kaldırılmalıdır. Bu işlevler, doğrudan işlev çağrılarından 1000 kat daha yavaş sıralanabilir.

  1. Kutulamalara dikkat edin

    Kutulama , C# dilinin ve çalışma zamanının temel kavramlarından biridir. , , boolvb. gibi charintdeğer türündeki değişkenleri başvuru türündeki değişkenlere sarmalama işlemidir. Değer türündeki bir değişken "kutulanmış" olduğunda, yönetilen yığında depolanan bir System.Objectiçine sarmalanır. Bellek ayrılır ve sonunda atıldığında çöp toplayıcı tarafından işlenmesi gerekir. Bu ayırmalar ve serbest bırakmalar bir performans maliyetine neden olur ve birçok senaryoda gereksizdir veya daha düşük maliyetli bir alternatifle kolayca değiştirilebilir.

    Kutulamadan kaçınmak için, sayısal türleri ve yapıları (dahil) Nullable<T>depoladığınız değişkenlerin, alanların ve özelliklerin, nesne kullanmak yerine, veya MyStructgibi belirli türler olarak intfloat? yazıldıklarından emin olun. Bu nesneleri bir listeye yerleştirdiyseniz, veya ArrayListyerine List<object> gibi List<int> kesin olarak belirlenmiş bir liste kullandığınızdan emin olun.

    C'de kutulama örneği#

    // boolean value type is boxed into object boxedMyVar on the heap
    bool myVar = true;
    object boxedMyVar = myVar;
    

Kod yollarını yineleme

Saniyede ve/veya çerçevede birçok kez yürütülen yinelenen Unity geri çağırma işlevleri (güncelleştirme) dikkatle yazılmalıdır. Buradaki tüm pahalı işlemler performans üzerinde çok büyük ve tutarlı bir etkiye sahip olacaktır.

  1. Boş geri çağırma işlevleri

    Aşağıdaki kodun uygulamanızda bırakılması masum gibi görünse de, özellikle her Unity betiği bir Update yöntemiyle otomatik olarak başlatıldığından, bu boş geri çağırmalar pahalı hale gelebilir. Unity, UnityEngine kodu ve uygulama kodunuz arasında yönetilmeyen ve yönetilen bir kod sınırı arasında ileri geri çalışır. Yürütülecek bir şey olmasa bile bu köprüden bağlam geçişi oldukça pahalıdır. Uygulamanızda boş yinelenen Unity geri çağırmaları olan bileşenlere sahip 100'lü GameObject'ler varsa bu özellikle sorunlu hale gelir.

    void Update()
    {
    }
    

Not

Update() bu performans sorununun en yaygın belirtisidir, ancak aşağıdakiler gibi diğer yinelenen Unity geri çağırmaları da aynı derecede kötü olabilir, daha kötü değilse: FixedUpdate(), LateUpdate(), OnPostRender", OnPreRender(), OnRenderImage()), vb.

  1. Çerçeve başına bir kez çalıştırmayı tercih eden işlemler

    Aşağıdaki Unity API'leri birçok Holographic Uygulaması için yaygın işlemlerdir. Her zaman mümkün olmasa da, bu işlevlerin sonuçları genellikle bir kez hesaplanabilir ve sonuçlar belirli bir çerçeve için uygulama genelinde 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 özdeş 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'lere karşı ışın yayınları gerektirebilir.

        UnityEngine.Physics.Raycast()
        UnityEngine.Physics.RaycastAll()
    

    b) Start() veya Awake() içinde başvuruları önbelleğe alarak Update() gibi yinelenen Unity geri çağırmalarında GetComponent() işlemlerinden kaçının

        UnityEngine.Object.GetComponent()
    

    c) Mümkünse, başlatma sırasında tüm nesneleri örneklemek ve uygulamanızın çalışma zamanı boyunca GameObjects'i geri dönüştürmek ve yeniden kullanmak için nesne havuzu kullanmak iyi bir uygulamadır

        UnityEngine.Object.Instantiate()
    
  2. Arabirimlerden ve sanal yapılardan kaçının

    İşlev çağrılarını arabirimler veya 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ı kullanmaktan çok daha pahalı olabilir. Sanal işlev veya arabirim gereksizse kaldırılmalıdır. Ancak, bu yaklaşımların kullanılması geliştirme işbirliğini, kod okunabilirliğini ve kod bakımını kolaylaştırıyorsa, bu yaklaşımların performans düşüşlerine değer.

    Genellikle, bu üyenin üzerine yazılması gerektiği açık bir beklenti olmadıkça alanları ve işlevleri sanal olarak işaretlememek önerilir. Özellikle bir yöntem gibi UpdateUI() kare başına birçok kez veya hatta bir kez çağrılan yüksek frekanslı kod yolları konusunda dikkatli olunmalıdır.

  3. Yapıları değere göre geçirmekten kaçının

    Sınıflardan farklı olarak yapılar değer türleridir ve doğrudan bir işleve geçirildiğinde içerikleri yeni oluşturulan bir örneğe kopyalanır. Bu kopya, CPU maliyetinin yanı sıra yığına ek bellek ekler. Küçük yapılar için etki çok azdır ve bu nedenle kabul edilebilirdir. Ancak, her kareyi tekrar tekrar çağıran 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ştirin. Buradan daha fazla bilgi edinin

Çeşitli

  1. Fizik

    a) Genellikle, fiziği geliştirmenin en kolay yolu Fizik için harcanan süreyi veya saniyedeki yineleme sayısını sınırlamaktır. Bu, simülasyon doğruluğunu azaltır. Bkz. Unity'de TimeManager

    b) Unity'deki çarpıştırıcı türleri çok farklı performans özelliklerine sahiptir. Aşağıdaki sıra, en yüksek performanslı harmanlayıcıları soldan sağa doğru en az performans gösteren çarpıştırıcıları listeler. İlkel collider'lardan çok daha pahalı olan Mesh Collider'lardan kaçınmak önemlidir.

    Sphere < Kapsül < Kutusu <<< Mesh (Dışbükey) < Mesh (Dışbükey olmayan)

    Daha fazla bilgi için bkz. Unity Fizik en iyi yöntemleri

  2. Animasyonlar

    Animator bileşenini devre dışı bırakarak boşta animasyonları devre dışı bırakın (oyun nesnesini devre dışı bırakmak aynı etkiye sahip olmaz). Bir animatörün döngüde yer aldığı ve değeri aynı değere ayarladığı tasarım desenlerinden kaçının. 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 algoritmalar

    Uygulamanız ters kinematik, yol bulma vb. gibi karmaşık algoritmalar kullanıyorsa, daha basit bir yaklaşım bulmaya veya performansı için ilgili ayarları ayarlamaya bakın

CPU'den GPU'ya performans önerileri

Genellikle CPU-GPU performansı, grafik kartına gönderilen çizim çağrılarına bağlıdır. Performansı geliştirmek için çizim çağrılarının stratejik olarak a) azaltılmış veya b) en iyi sonuçlar için yeniden yapılandırılması gerekir. Çizim çağrılarının kendisi yoğun kaynak kullandığından, bunların azaltılması gereken genel çalışmayı azaltır. Ayrıca, çizim çağrıları arasındaki durum değişiklikleri grafik sürücüsünde maliyetli doğrulama ve çeviri adımları gerektirir ve bu nedenle durum değişikliklerini (farklı malzemeler vb.) sınırlamak için uygulamanızın çizim çağrılarının yeniden yapılandırılması performansı artırabilir.

Unity'nin genel bakış sağlayan harika bir makalesi vardır ve platformları için çekme çağrılarını toplu olarak ele alır.

Tek geçişli örnekli işleme

Unity'de Tek GeçişLi Örnekli İşleme, her göze yönelik çizim çağrılarının bir örnekli çizim çağrısına indirgenmesini sağlar. İki çizim çağrısı arasındaki önbellek tutarlılığı nedeniyle GPU'da da bazı performans geliştirmeleri vardır.

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

  1. OpenXR Ayarları'nı açın (Proje Ayarlarını>Düzenle>XR Eklenti Yönetimi>OpenXR'ye gidin).
  2. İşleme Modu açılan menüsünden Tek Geçiş Örneği'ni seçin.

Bu işleme yaklaşımıyla ilgili ayrıntılar için Unity'nin aşağıdaki makalelerini okuyun.

Not

Tek GeçişLi Örnekli İşleme ile ilgili yaygın sorunlardan biri, geliştiricilerin zaten mevcut özel gölgelendiricileri var olduğunda ve bu gölgelendiriciler, başlangıç için yazılmamışsa oluşur. Geliştiriciler bu özelliği etkinleştirdikten sonra bazı GameObject'lerin yalnızca tek bir gözle işlenip işlenebileceğini fark edebilir. Bunun nedeni, ilişkili özel gölgelendiricilerin kapsayıcı için uygun özelliklere sahip olmamasıdır.

Bu sorunu giderme hakkında bilgi için bkz. Unity'den HoloLens için Tek Geçişli Stereo İşleme

Statik toplu işlem

Unity, GPU'ya yapılan çekme çağrılarını azaltmak için birçok statik nesneyi toplu olarak çalıştırabilir. Statik Toplu İşleme, Unity'deki çoğu İşleyici nesnesi için çalışır; 1) aynı malzemeyi paylaşır ve 2) tümü Statik olarak işaretlenir (Unity'de bir nesne seçin ve denetçinin sağ üst kısmındaki onay kutusunu seçin). Statik olarak işaretlenmiş GameObjects, uygulamanızın çalışma zamanı boyunca taşınamaz. Bu nedenle, neredeyse her nesnenin yerleştirilmesi, taşınması, ölçeklendirilmesi vb. gereken HoloLens'te statik toplu işlemeden yararlanmak zor olabilir. Çevreleyici başlıklar için statik toplu iş oluşturma, çekme çağrılarını önemli ölçüde azaltabilir ve bu sayede performansı artırabilir.

Daha fazla ayrıntı için Unity'de Çağrı Toplu İşlemi Çiz'in altındaki Statik Toplu İşlem'i okuyun.

Dinamik toplu işlem

Nesneleri HoloLens geliştirme için Statik olarak işaretlemek sorunlu olduğundan, dinamik toplu işlem bu eksik özelliği telafi etmek için harika bir araç olabilir. Çevreleyici kulaklıklarda da yararlı olabilir. Ancak GameObjects'in aynı Malzemeyi paylaşması ve b) diğer ölçütlerin uzun bir listesini karşılaması gerektiğinden Unity'de dinamik toplu işlemeyi etkinleştirmek zor olabilir.

Tam liste için Unity'de Çağrı Toplu İşlemi Çiz'in altındaki Dinamik Toplu İşlem'i okuyun. En yaygın olarak, ilişkili mesh verileri 300'den fazla köşe içeremediğinden GameObjects dinamik olarak toplu işlenmek için geçersiz hale gelir.

Diğer teknikler

Toplu işlem yalnızca birden çok GameObject aynı malzemeyi paylaşabiliyorsa gerçekleşebilir. Genellikle bu, GameObjects'in ilgili Malzeme için benzersiz bir dokuya sahip olması gereksinimi nedeniyle engellenir. Dokuları Doku Atlaslama olarak bilinen büyük bir Doku yönteminde birleştirmek yaygın bir yöntemdir.

Ayrıca, mümkün ve makul yerlerde tek bir GameObject içinde külleri birleştirmek tercih edilir. Unity'deki her işleyici, tek bir oluşturucu altında birleşik bir mesh göndermek yerine ilişkili çizim çağrılarına sahip olur.

Not

Çalışma zamanında Renderer.material'ın özelliklerini değiştirmek, Malzeme'nin bir kopyasını oluşturur ve bu nedenle büyük olasılıkla toplu işlemeyi bozar. GameObjects genelinde paylaşılan malzeme özelliklerini değiştirmek için Renderer.sharedMaterial kullanın.

GPU performans önerileri

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

Bant genişliği ve doldurma hızları

GPU'da bir çerçeve işlenirken, uygulama bellek bant genişliğine veya doldurma hızına bağlıdır.

  • Bellek bant genişliği , GPU'nun bellekten gerçekleştirebileceği okuma ve yazma hızıdır
  • Doldurma hızı , GPU tarafından saniye başına çizilebilen pikselleri ifade eder.

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

Hologram kararlılığını iyileştirmek için Derinlik arabelleği paylaşımını etkinleştirmenizi öneririz. Bu ayar ile derinlik tabanlı geç aşama yeniden oluşturma özelliğini etkinleştirirken, 24 bit derinlik biçimi yerine 16 bit derinlik biçimi seçmenizi öneririz. 16 bit derinlik arabellekleri, derinlik arabellek trafiğiyle ilişkili bant genişliğini (ve dolayısıyla gücü) önemli ölçüde azaltır. Bu hem güç azaltma hem de performans açısından büyük bir gelişme olabilir. Ancak, 16 bit derinlik biçimi kullanılarak iki olası olumsuz sonuç vardır.

Z Ile Mücadele

Azaltılmış derinlik aralığı uygunluğu , z ile mücadelenin 16 bit ile 24 bitten daha olası olmasını sağlar. Bu yapıtları önlemek için Unity kamerasının yakın/uzak klips düzlemlerini daha düşük duyarlığı hesaba katacak şekilde değiştirin. HoloLens tabanlı uygulamalar için Unity varsayılan 1000 m yerine 50 m'lik uzak klips düzlemi genellikle z ile mücadeleyi ortadan kaldırabilir.

Devre Dışı Kalıp AraBelleği

Unity 16 bit derinlikli bir İşleme Dokusu oluşturduğunda, hiçbir kalıp arabelleği oluşturulmaz. Unity belgelerinde açıklandığı gibi 24 bit derinlik biçimini seçtiğinizde 24 bit z arabelleği ve 8 bit kalıp arabelleği oluşturulur (bir cihazda 32 bit geçerliyse (örneğin HoloLens), bu genellikle geçerlidir.

Tam ekran efektlerinden kaçının

Tam ekranda çalışan teknikler pahalı olabilir çünkü büyüklük sırası her karede milyonlarca işlemdir. Diğer ad önleme, çiçek açma ve daha fazlası gibi işlem sonrası etkilerden kaçınmanızı öneririz.

En iyi aydınlatma ayarları

Unity'de gerçek zamanlı Global Aydınlatma olağanüstü görsel sonuçlar sağlayabilir ancak pahalı aydınlatma hesaplamaları içerir. Window>Rendering>Lighting Settings> Uncheck Real-time Global Lighting aracılığıyla her Unity sahne dosyası için gerçek zamanlı Global Aydınlatma'nın devre dışı bırakılması önerilir.

Ayrıca, unity sahnesine pahalı GPU geçişleri de eklediğinden tüm gölge atamalarını devre dışı bırakmanızı öneririz. Gölgeler ışık başına devre dışı bırakılabilir ancak Kalite ayarları aracılığıyla bütünsel olarak kontrol edilebilir.

Düzenle>Proje Ayarları'nı ve ardından UWP Platformu için Düşük Kaliteyi Seç Kalite kategorisini > seçin. Gölgeler özelliğini GölgeleriDevre Dışı Bırak olarak da ayarlayabilirsiniz.

Unity'de modellerinizle birlikte fırınlanmış aydınlatma kullanmanızı öneririz.

Poli sayısını azaltma

Çokgen sayısı iki durumdan biri tarafından azaltılır

  1. Bir sahneden nesneleri kaldırma
  2. Belirli bir mesh için çokgen sayısını azaltan varlık bildirimi
  3. Uygulamanıza bir Ayrıntı Düzeyi (LOD) Sistemi uygulama, bu da uzak nesneleri aynı geometrinin daha düşük çokgen sürümüyle işler

Unity'de gölgelendiricileri anlama

Performanstaki gölgelendiricileri karşılaştırmak için kolay bir tahmin, her birinin çalışma zamanında yürüttüğü 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, ardından denetçi penceresinin sağ üst köşesinde dişli simgesini ve ardından "Gölgelendiriciyi Seç" öğesini seçin

    Unity'de gölgelendirici seçme

  2. Gölgelendirici varlığı seçiliyken, denetçi penceresinin altındaki "Kodu derle ve göster" düğmesini seçin

    Unity'de Gölgelendirici Kodunu Derleme

  3. Derledikten sonra, sonuçlarda hem köşe hem de piksel gölgelendiricisi için farklı işlemlerin sayısını içeren istatistik bölümünü arayın (Not: piksel gölgelendiricileri genellikle parça gölgelendiricileri olarak da adlandırılır)

    Unity Standart Gölgelendirici İşlemleri

Piksel gölgelendiricilerini iyileştirme

Yukarıdaki yöntemi kullanarak derlenmiş istatistik sonuçlarına baktığınızda, parça gölgelendiricisi genellikle ortalama olarak köşe gölgelendiricisinden daha fazla işlem yürütür. Piksel gölgelendiricisi olarak da bilinen parça gölgelendiricisi, ekran çıkışında piksel başına yürütülürken, köşe gölgelendiricisi yalnızca ekrana çizilen tüm tirelerin köşe başına yürütülür.

Bu nedenle, tüm aydınlatma hesaplamaları nedeniyle parça gölgelendiricileri köşe gölgelendiricilerinden daha fazla yönergeye sahip değildir, parça gölgelendiricileri neredeyse her zaman daha büyük bir veri kümesinde yürütülür. Örneğin, ekran çıkışı 2k x 2k görüntüyse parça gölgelendiricisi 2.000*2.000 = 4.000.000 kez yürütülebilir. İki göz işlenirse, iki ekran olduğundan bu sayı iki katına çıkarır. Karma gerçeklik uygulamasının birden çok geçişi, tam ekran işlem sonrası efektleri veya aynı pikselde birden çok kısa çizgi işlemesi varsa, bu sayı önemli ölçüde artar.

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

Unity Standard gölgelendirici alternatifleri

Fiziksel tabanlı işleme (PBR) veya başka bir yüksek kaliteli gölgelendirici kullanmak yerine, daha performanslı ve daha ucuz bir gölgelendirici kullanmaya bakın. Karma Gerçeklik Araç Seti, karma gerçeklik projeleri için en iyi duruma getirilmiş MRTK standart gölgelendiricisini sağlar.

Unity ayrıca Unity Standard gölgelendiricisine kıyasla daha hızlı olan ışıksız, köşeli, ayrık ve diğer basitleştirilmiş gölgelendirici seçeneklerini de sağlar. Daha ayrıntılı bilgi için bkz. Yerleşik Gölgelendiricilerin Kullanımı ve Performansı .

Gölgelendirici önceden yükleme

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

Limit overdraw

Unity'de, Sahne görünümünün sol üst köşesindeki çizim modu menüsünü açıp Overdraw'ı seçerek sahnesi için overdraw görüntüleyebilir.

Genel olarak, gpuya gönderilmeden önce nesneleri dolanarak fazla çizim azaltılabilir. Unity, altyapısı için Occlusion Culling uygulama hakkında ayrıntılı bilgi sağlar.

Bellek önerileri

Aşırı bellek ayırma & ayırma işlemleri holografik uygulamanızda olumsuz etkilere neden olarak tutarsız performans, donmuş çerçeveler ve diğer zararlı davranışlara neden olabilir. Bellek yönetimi atık toplayıcı tarafından denetlendiğinden Unity'de geliştirme sırasında bellekle ilgili dikkat edilmesi gereken noktaları anlamak özellikle önemlidir.

Atık toplama

Yürütme sırasında kapsam dahilinde olmayan nesneleri analiz etmek için GC etkinleştirildiğinde ve belleklerinin yeniden kullanılabilir hale getirilebilmesi için holografik uygulamalar atık toplayıcıya (GC) işlem süresini kaybeder. Sabit ayırmalar ve ayırmaları kaldırma işlemleri genellikle çöp toplayıcının daha sık çalışmasını gerektirir, bu nedenle performans ve kullanıcı deneyimi zarar görür.

Unity, çöp toplayıcının nasıl çalıştığını ve bellek yönetimi açısından daha verimli kod yazmaya yönelik ipuçlarını ayrıntılı olarak açıklayan mükemmel bir sayfa sağladı.

Aşırı çöp toplamaya yol açan en yaygın uygulamalardan biri Unity geliştirmedeki bileşenlere ve sınıflara yapılan başvuruları önbelleğe almamaktır. Tüm başvurular Start() veya Awake() sırasında yakalanıp Update() veya LateUpdate() gibi sonraki işlevlerde yeniden kullanılmalıdır.

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

  • Çalışma zamanında dinamik olarak karmaşık dizeler oluşturmak 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 Debug.Log() çağrılarını kaldırma
  • Holografik uygulamanız genellikle çok fazla bellek gerektiriyorsa, yükleme veya geçiş ekranı sunma gibi yükleme aşamaları sırasında System.GC.Collect() çağrısı yapmayı göz önünde bulundurun

Nesne havuzu oluşturma

Nesne havuzu, sürekli nesne ayırma ve serbest bırakma maliyetlerini azaltmaya yönelik popüler bir tekniktir. Bu, büyük bir özdeş nesne havuzu ayırarak ve zaman içinde nesneleri sürekli olarak oluşturup yok etmek yerine etkin olmayan, kullanılabilir örnekleri bu havuzdan yeniden kullanarak yapılır. Nesne havuzları, uygulama sırasında değişken ömrü olan yeniden kullanılabilir bileşenler için harikadır.

Başlangıç performansı

Uygulamanızı daha küçük bir görünümle başlatmayı, ardından sahnenin geri kalanını yüklemek için SceneManager.LoadSceneAsync'i kullanmayı düşünün. Bu, uygulamanızın mümkün olan en hızlı şekilde etkileşimli duruma geçmesini sağlar. Yeni sahne etkinleştirilirken büyük bir CPU artışı olabilir ve işlenen tüm içerikler takılmaya veya takılmaya neden olabilir. Bu sorunu geçici olarak çözmek için AsyncOperation.allowSceneActivation özelliğini yüklenen sahnede "false" olarak ayarlamak, sahnenin yüklenmesini beklemek, ekranı siyaha temizlemek ve ardından sahne etkinleştirmeyi tamamlamak için "true" olarak geri ayarlamaktır.

Başlangıç sahnesi yüklenirken holografik giriş ekranının kullanıcıya gösterileceğini unutmayın.

Ayrıca bkz.