Aracılığıyla paylaş


Unity için performans önerileri

Bu makale karma gerçeklik için performans önerilerini temel alır, ancak Unity'ye özgü iyileş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, uygulamanız için değerli performans içgörüleri toplamak için harika bir kaynak olan Unity Profiler'ı yerleşik olarak sunar. 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 Profiler ile performans sorunlarını etkili bir şekilde tanılama

GPU profili oluşturma

Unity profil oluşturucu

Unity Profiler bağlı 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 ve GPU'da ne kadar zaman harcandığını görebilirsiniz. Bu, geliştiricinin uygulaması CPU veya GPU sınırına sahipse 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 Grafik İşleri'ni devre dışı bırakmanız gerekir. Daha fazla ayrıntı 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ı , aynı zamanda kullanmak için güçlü ve içgörü sahibi bir araçtır. Gpu'nun her kareyi ne yaptığına ilişkin iyi bir genel bakış sağlayacaktır. HoloLens'te ç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 Görüntü kare hızı grafiğini etkinleştirebilirsiniz. Bu seçenekler sırasıyla, cihazınızda çalışan tüm uygulamalarla ilgili anında geri bildirim sağlayacak bir FPS sayacını ve grafiği etkinleştirir.

PİX

PIX , Unity uygulamalarının profilini de almak için kullanılabilir. HoloLens 2 için PIX'yi 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ı olarak incelenip profili oluşturulabilir.

Not

Unity, XR Ayarlar.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üklü çıktıyı örnekleyecektir.

UnityEngine.XR.XRSettings.renderViewportScale = 0.7f;

CPU performans önerileri

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

Önbellek başvuruları

GetComponent T() ve Kamera.main gibi yinelenen işlev çağrıları, işaretçi 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.>< . Kamera.main yalnızca altında FindGameObjectsWithTag() kullanır ve bu da "Main Kamera" etiketine sahip bir kamera nesnesini pahalı bir şekilde 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 kullanmamak ö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. Boksa 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ü belirlenmiş bir değişken "kutulanmış" olduğunda, yönetilen yığında depolanan bir System.Objectiçinde 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 kolayca daha ucuz bir alternatifle değiştirilebilir.

    Kutulamadan kaçınmak için, sayısal türleri ve yapıları (dahilNullable<T>) depoladığınız değişkenlerin, alanların ve özelliklerin nesne kullanmak yerine, veya gibi belirli türler olarak intfloat?MyStructyazıldığından emin olun. Bu nesneleri bir listeye koyuyorsanız, 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 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 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ıya gelebilir. Unity, UnityEngine kodu ile 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ü üzerinden bağlam geçişi oldukça pahalıdır. Uygulamanızın yinelenen Unity geri çağırmaları boş bileşenleri olan 100'lü GameObject'leri varsa bu durum ö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ı, daha kötü değilse aynı derecede kötü olabilir: 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 Apps için yaygın işlemlerdir. Her zaman mümkün olmasa da, bu işlevlerden elde edilen sonuçlar genellikle bir kez hesaplanabilir ve sonuçlar belirli bir çerçeve için uygulama genelinde yeniden kullanılabilir.

    a) Her bileşen tarafından yinelenen ve özdeş Raycast işlemleri yapmak yerine, raycast'inizi sahnede işlemek ve ardından bu sonucu diğer tüm sahne bileşenlerinde yeniden kullanmak için ayrılmış bir Singleton sınıfına veya hizmetine sahip olmak iyi bir uygulamadır. Bazı uygulamalar farklı kaynaklardan veya farklı LayerMask'lere karşı raycast 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 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ı 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 sürdürülebilirliğini kolaylaştırıyorsa, bu yaklaşımların performans isabeti dengeye 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çindekiler 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şlevler ve 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. Burada daha fazla bilgi edinin

Çeşitli

  1. Fizik

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

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

    Sphere < Capsule < Box <<< Mesh (Dışbükey) < Mesh (Dışbükey olmayan)

    Daha fazla bilgi için bkz. Unity Fizik En İyi 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 animasyon aracının bir döngüde bulunduğu 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 kinematikler, yol bulma gibi karmaşık algoritmalar kullanıyorsa daha basit bir yaklaşım bulmaya veya performansı için ilgili ayarları yapmaya bakın

CPU'den GPU'ya performans önerileri

Genellikle CPU-GPU performansı, grafik kartına gönderilen çizim çağrılarına kadar gelir. 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, bu çağrıları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 bir bakış sağlayan harika bir makalesi vardır ve platformları için çizim ç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öz için ç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 açın (Project Ayarlar> XR Eklenti Yönetimi>OpenXR'yi Düzenle'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 var olan özel gölgelendiricileri, parola ekleme için yazılmadıysa oluşur. Bu özelliği etkinleştirdikten sonra geliştiriciler bazı GameObject'lerin yalnızca tek bir gözle işlenip işlenmeyebileceğini fark edebilir. Bunun nedeni, ilişkili özel gölgelendiricilerin kapsayıcı için uygun özelliklere sahip olmamasıdır.

Statik toplu işlem

Unity, GPU'ya yönelik çizim çağrılarını azaltmak için birçok statik nesneyi toplu olarak çalıştırabiliyor. Statik Toplu İşleme, Unity'de 1) aynı malzemeyi paylaşan ve 2) statik olarakişaretlenen çoğu oluşturucu nesnesi için çalışır (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, sanal olarak her nesnenin yerleştirilmesi, taşınması, ölçeklendirilmesi vb. gereken HoloLens'te statik toplu işlemden yararlanmak zor olabilir. Çevreleyici mikrofonlu kulaklıklar için statik toplu işlem, çekme çağrılarını önemli ölçüde azaltabilir ve böylece performansı artırabilir.

Daha fazla ayrıntı için Unity'de Çağrı Toplu İşlemi Çizme altındaki Statik Toplu İşlem bölümünü okuyun.

Dinamik toplu işlem

Nesneleri HoloLens geliştirmesi 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şlemi etkinleştirmek zor olabilir.

Tam liste için Unity'de Çağrı Toplu İşlemi Çiz altında Dinamik Toplu İşlem'i okuyun. En yaygın olarak, ilişkili mesh verileri en fazla 300 köşe olabileceğinden GameObjects dinamik olarak toplu işlenmek üzere 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ı gerektiğinde engellenir. Dokuları Doku Atlaslama olarak bilinen bir yöntem olan tek bir büyük Dokuda birleştirmek yaygın bir yöntemdir.

Ayrıca, mümkün ve makul olduğunda mesh'leri tek bir GameObject içinde birleştirmek tercih edilir. Unity'deki her oluşturucu, 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 Malzemenin bir kopyasını oluşturur ve böylece toplu işlemi 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 oranları

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
    • Unity'de, Projeyi Düzenle>Ayarlar Quality Ayarlar> Doku Kalitesi'ni değiştirin.
  • Doldurma hızı , GPU tarafından saniye başına çizilebilen pikselleri ifade eder.
    • Unity'de XR Ayarlar.renderViewportScale özelliğini kullanın.

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 derlemeyi etkinleştirirken, 24 bit derinlik biçimi yerine 16 bit derinlik biçimi seçmenizi öneririz. 16 bit derinlik arabellekleri, derinlik arabelleği trafiğiyle ilişkili bant genişliğini (ve dolayısıyla gücü) önemli ölçüde azaltır. Bu hem güç azaltmada hem de performansta büyük bir gelişme olabilir. Ancak, 16 bit derinlik biçimi kullanılarak iki olası olumsuz sonuç vardır.

Z-Dövüş

Azaltılmış derinlik aralığı uygunluğu, z savaşma olasılığının 16 bit ile 24 bitten daha yüksek olmasını sağlar. Bu yapıtları önlemek için Unity kamerasının yakın/uzak klip 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 çok küçük bir düzlem genellikle tüm z dövüşlerini 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 arabellek ve 8 bit kalıp arabelleği (bir cihazda 32 bit uygulanıyorsa (örneğin HoloLens) oluşturulur ve bu genellikle böyledir.

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ı etkilerinden kaçınmanız önerilir.

En uygun 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 Ayarlar> 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, bunlar da Unity sahnesine pahalı GPU geçişleri 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.

Project Ayarlar düzenleyin>, ardından UWP Platformu için Düşük Kalite Seç kalite kategorisini > seçin. Ayrıca Gölgeler özelliğini Gölgeleri Devre 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 ağ için çokgen sayısını azaltan varlık gösterimi
  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ü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, 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çili durumdayken, 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 kafeslerin köşe başına yürütülür.

Bu nedenle, tüm aydınlatma hesaplamaları nedeniyle yalnızca parça gölgelendiricilerinin köşe gölgelendiricilerinden daha fazla yönergesi yoktur, 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şleniyorsa, iki ekran olduğundan bu sayı iki katına çıkarsa. Karma gerçeklik uygulamasının birden çok geçişi, tam ekran işlem sonrası efektleri veya aynı pikselde birden çok tire 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 kazancı 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ı ve daha ucuz bir gölgelendirici kullanmaya bakın. Karma Gerçeklik Araç Seti, karma gerçeklik projeleri için iyileştirilmiş 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ölgelendirici önceden yükleme, çalışma zamanı gölgelendiricisi derlemesi nedeniyle herhangi bir sorun 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 fazla çizim görüntüleyebilir.

Genel olarak, gpuya gönderilmeden önce nesneleri itlaf ederek aşırı çizim azaltılabilir. Unity, altyapısı için Oklüzyon Culling uygulama hakkında ayrıntılı bilgi sağlar.

Bellek önerileri

Aşırı bellek ayırma ve serbest bırakma işlemlerinin holografik uygulamanız üzerinde olumsuz etkileri olabilir ve bu da tutarsız performans, donmuş çerçeveler ve diğer zararlı davranışlara neden olabilir. Bellek yönetimi çöp 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ı artık olmayan nesneleri analiz etmek için GC etkinleştirildiğinde ve belleklerinin serbest bırakılması gerektiğinde, holografik uygulamalar işlem işlemini çöp toplayıcıya (GC) kaybeder, böylece yeniden kullanılabilir hale getirilebilir. 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 performansa ve kullanıcı deneyimine zarar verebilirsiniz.

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

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

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

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şturmak ve yok etmek yerine bu havuzdan etkin olmayan, kullanılabilir örnekleri yeniden kullanarak yapılır. Nesne havuzları, uygulama sırasında değişken ömrü olan yeniden kullanılabilir bileşenler için mükemmeldir.

Başlangıç performansı

Uygulamanızı daha küçük bir sahneyle başlatmayı ve ardından sahnenin geri kalanını yüklemek için SceneManager.LoadSceneAsync'i kullanmayı göz önünde bulundurun. Bu, uygulamanızın mümkün olan en hızlı şekilde etkileşimli bir duruma sahip olmasını sağlar. Yeni sahne etkinleştirilirken büyük bir CPU artışı olabilir ve işlenen tüm içerikler kekelenebilir 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ı siyah olarak temizlemek ve ardından sahne etkinleştirmeyi tamamlamak için "true" olarak ayarlamaktır.

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

Ayrıca bkz.