Performans — MRTK2

Başlarken

Performansı rasyonalize etmenin en kolay yolu kare hızı veya uygulamanızın saniyede kaç kez görüntü işleyebileceğidir. Hedeflenen platformun (Windows Mixed Reality,Oculus vb.) belirttiği gibi hedef kare hızını karşılamak önemlidir. Örneğin HoloLens'te hedef kare hızı 60 FPS'dir. Düşük kare hızına sahip uygulamalar, kötüleştirilmiş hologram dengeleme, dünya izleme, el izleme ve daha fazlası gibi kötü kullanıcı deneyimlerine neden olabilir. Geliştiricilerin kalite kare hızını izlemesine ve elde etmelerine yardımcı olmak için Karma Gerçeklik Araç Seti çeşitli araçlar ve betikler sağlar.

Görsel profil oluşturucu

Geliştirme ömrü boyunca performansı sürekli izlemek için, bir uygulamada hata ayıklama & çalıştırırken her zaman kare hızındaki bir görselin gösterilmesi kesinlikle önerilir. Karma Gerçeklik Araç Seti, uygulama görünümünde geçerli FPS ve bellek kullanımı hakkında gerçek zamanlı bilgi sağlayan Görsel Profil Oluşturucu tanılama aracını sağlar. Görsel Profil Oluşturucu, MRTK Profil Denetçisi altındaki Tanılama Sistemi Ayarları aracılığıyla yapılandırılabilir.

Ayrıca, Unity düzenleyicisinde veya öykünücüde çalıştırmak yerine cihazda çalışırken kare hızını izlemek için Görsel Profil Oluşturucu'yu kullanmak özellikle önemlidir. En doğru performans sonuçları, Yayın yapılandırması derlemeleriyle cihazda çalıştırılırken gösterilir.

Not

Windows Mixed Reality için oluşturuyorsanız MASTER yapılandırma derlemeleriyle dağıtın.

Görsel Profil Oluşturucu Arabirimi

En iyi duruma getirme penceresi

MRTK İyileştirme Penceresi, karma gerçeklik geliştiricilerinin ortamlarını en iyi performansa sahip sonuçlar için ayarlamalarına ve sahne & varlıklarındaki olası performans sorunlarını belirlemelerine yardımcı olan bilgi ve otomasyon araçları sunar. Unity'deki bazı önemli yapılandırmalar, karma gerçeklik projeleri için önemli ölçüde daha iyileştirilmiş sonuçlar sağlamaya yardımcı olabilir.

Bu ayarlar genellikle karma gerçeklik için ideal olan işleme yapılandırmalarını içerir. Karma gerçeklik uygulamaları, tüm sahne için işlenmek üzere iki ekran (yani iki göz) bulunduğundan geleneksel 3B grafik geliştirmeye kıyasla benzersizdir.

Aşağıda belirtilen önerilen ayarlar, MRTK İyileştirme Penceresi'ni kullanarak unity projesinde otomatik olarak yapılandırılabilir.

MRTK İyileştirme Penceresi Ayarları

Unity Profiler

Unity Profiler, uygulama performansının ayrıntılarını çerçeveler arası düzeyde araştırmak için kullanışlı bir araçtır.

CPU'da harcanan süre

Örnek Unity Profil Oluşturucu Grafı

Rahat kare hızlarını korumak için (genellikle saniyede 60 kare), uygulamaların maksimum 16,6 milisaniye CPU süresi elde etmek gerekir. Microsoft Karma Gerçeklik Toolkit, MRTK işlevselliğinin maliyetini belirlemeye yardımcı olmak için iç döngü (çerçeve başına) kod yollarına yönelik bir işaretçi içerir. Bu işaretçiler, kullanılmakta olan belirli işlevlerin anlaşılmasına yardımcı olmak için aşağıdaki biçimi kullanır:

[MRTK] className.methodName

Not

Yöntem adından sonra ek veriler olabilir. Bu, uygulama kodunda yapılan küçük değişikliklerden kaçınılabilecek koşullu olarak yürütülen ve pahalı olabilecek işlevleri tanımlamak için kullanılır.

Örnek Unity Profil Oluşturucu Hiyerarşisi

Bu örnekte hiyerarşi, WindowsMixedRealityArticulatedHand sınıfının UpdateHandData yönteminin analiz edilen çerçeve sırasında 0,44 ms CPU süresi tükettiğini gösterecek şekilde genişletilmiştir. Bu veriler, bir performans sorununun uygulama koduyla mı yoksa sistemin başka bir yerinden mi ilgili olduğunu saptamaya yardımcı olmak için kullanılabilir.

Geliştiricilerin uygulama kodunu benzer şekilde izlemesi kesinlikle önerilir. Uygulama kodu izlemesi için birincil odak alanları olay işleyicileri içindedir, bu yöntemler olaylar tetiklenirken MRTK güncelleştirme döngüsüne ücretlendirilir. MRTK güncelleştirme döngüsü içindeki yüksek kare süreleri, olay işleyici yöntemlerindeki pahalı kodların göstergesi olabilir.

Örnekli işlemeyi Single-Pass

Unity'de XR için varsayılan işleme yapılandırması Multi-pass'tir. Bu ayar Unity'ye işleme işlem hattının tamamını her göz için bir kez olmak üzere iki kez yürütmesini sağlar. Bunun yerine Tek GeçişLi Örnekli işleme seçilerek en iyi duruma getirilebilir. Bu yapılandırma, her göz için uygun işleme hedefinde örneklerin tek bir çizim çağrısı gerçekleştirebilmesi için işleme hedef dizilerinden yararlanıyor. Ayrıca, bu mod tüm işlemenin işleme işlem hattının tek bir yürütmesinde gerçekleştirilmesini sağlar. Bu nedenle karma gerçeklik uygulamasının işleme yolu olarak Tek Geçiş Örneği işlemenin seçilmesi hem CPU & GPU'da önemli zaman tasarrufu sağlayabilir hem de önerilen işleme yapılandırmasıdır.

Bununla birlikte, her göze her mesh için tek bir çizim çağrısı yapmak için , GPU dengeleme tüm gölgelendiriciler tarafından desteklenmelidir. Örnek oluşturma, GPU'un çağrıları her iki göze de katlamasını sağlar. Unity yerleşik gölgelendiricileri ve MRTK Standart gölgelendiricisi varsayılan olarak gölgelendirici kodunda gerekli gölgelendirici yönergelerini içerir. Unity için özel gölgelendiriciler yazılıyorsa, bu gölgelendiricilerin Tek Geçiş Örneği işlemeyi destekleyecek şekilde güncelleştirilmiş olması gerekebilir.

Özel Gölgelendirici için Örnek Kod

struct appdata
{
    float4 vertex : POSITION;
    float2 uv : TEXCOORD0;

    UNITY_VERTEX_INPUT_INSTANCE_ID //Insert
};

struct v2f
{
    float2 uv : TEXCOORD0;
    float4 vertex : SV_POSITION;

    UNITY_VERTEX_OUTPUT_STEREO //Insert
};

v2f vert (appdata v)
{
    v2f o;

    UNITY_SETUP_INSTANCE_ID(v); //Insert
    UNITY_INITIALIZE_OUTPUT(v2f, o); //Insert
    UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); //Insert

    o.vertex = UnityObjectToClipPos(v.vertex);

    o.uv = v.uv;

    return o;
}

Kalite ayarları

Unity, her platform uç noktası için işleme kalitesini denetlemek için ön ayarlar sağlar. Bu ön ayarlar gölgeler, kenar yumuşatma, genel aydınlatma ve daha fazlası gibi hangi grafik özelliklerinin etkinleştirilebileceğini denetler. Bu ayarları düşürmenizi ve işleme sırasında gerçekleştirilen hesaplama sayısını iyileştirmenizi öneririz.

1. Adım: Karma gerçeklik Unity projelerini Düşük Kalite düzeyi ayarını kullanacak şekilde güncelleştirme
Düzenle>Proje Ayarları'nı ve ardından UWP Platformu için Düşük Kaliteyi Seç Kalite kategorisini seçin >

2. Adım: Her Unity sahne dosyası için gerçek zamanlı Global Aydınlatma'yı devre dışı bırakın
Pencere>Işleme>Aydınlatma Ayarları>Gerçek Zamanlı Küresel Aydınlatma seçeneğinin işaretini kaldırın

Derinlik arabellek paylaşımı (HoloLens)

Windows Mixed Reality platformu ve özellikle HoloLens için geliştirmeler varsa, XR Ayarları altında Derinlik Arabelleği Paylaşımı'nı etkinleştirmek hologram dengelemeye yardımcı olabilir. Ancak derinlik arabelleğinin işlenmesi, özellikle 24 bit derinlik biçimi kullanılıyorsa bir performans maliyetine neden olabilir. Bu nedenle, derinlik arabelleğinin 16 bit duyarlığa yapılandırılması kesinlikle önerilir .

Z ile mücadele düşük bit biçimi nedeniyle oluşursa, tüm kameraların uzak klips düzleminin uygulama için mümkün olan en düşük değere ayarlandığını onaylayın. Unity varsayılan olarak 1000m uzak klip düzlemi ayarlar. HoloLens'te 50m'lik uzak klips düzlemi genellikle çoğu uygulama senaryosu için fazlasıyla yeterlidir.

Not

16 bit derinlik biçimi kullanılıyorsa, Unity bu ayarda kalıp arabelleği oluşturmadığından kalıp arabelleği gerekli etkileri çalışmaz. 24 bit derinlik biçiminin tersinin seçilmesi genellikle uç nokta grafik platformunda varsa 8 bitlik bir kalıp arabelleği oluşturur.

Kalıp arabelleği gerektiren bir Maske bileşeni kullanıyorsanız, kalıp arabelleği gerektirmeyen ve bu nedenle 16 bit derinlik biçimiyle birlikte kullanılabilen RectMask2D kullanmayı göz önünde bulundurun.

Not

Sahnedeki hangi nesnelerin derinlik arabelleğine görsel olarak yazı yazmadığını hızla belirlemek için MRTK Yapılandırma profilindeki Düzenleyici Ayarları altındaki İşleme Derinliği Arabelleği yardımcı programını kullanabilirsiniz.

Mesh Verilerini İyileştirme

Mesh Verilerini İyileştir ayarları, uygulamanızda kullanılmayan köşe özniteliklerini kaldırmaya çalışır. Bu ayar, derlemedeki her ağ üzerindeki her malzemedeki her gölgelendirici geçişinin üzerinden geçerek bunu gerçekleştirir. Bu, oyun veri boyutu ve çalışma zamanı performansı için iyidir, ancak derleme sürelerini önemli ölçüde engelleyebilir.

Geliştirme sırasında bu ayarı devre dışı bırakmanızı ve "Ana" derleme oluşturma sırasında yeniden etkinleştirmenizi öneririz. Bu ayarProje Ayarlarını>Düzenle>Oynatıcı>Diğer Ayarlar>Mesh Verilerini İyileştir altında bulunabilir.

Genel öneriler

Performans, karma gerçeklik geliştiricileri için belirsiz ve sürekli değişen bir zorluk olabilir ve performansı rasyonalize etmek için bilgi yelpazesi çok geniştir. Ancak, bir uygulama için performansa nasıl yaklaşılır anlamak için bazı genel öneriler vardır.

Bir uygulamanın CPU veya GPU üzerinde çalışan parçalara yürütülmesini basitleştirmek ve böylece bir uygulamanın iki bileşenle de sınırlanıp sınırlandığını belirlemek yararlı olur. Hem işlem birimlerini hem de dikkatle incelenmesi gereken bazı benzersiz senaryoları kapsayan performans sorunları olabilir. Ancak, kullanmaya başlamak için bir uygulamanın en fazla süre yürütüldüğü yeri kavramak iyidir.

GPU sınırlanmış

Karma gerçeklik uygulamalarına yönelik platformların çoğu stereoskopik işlemeden yararlandığından, "çift geniş" bir ekran işlemenin doğası gereği GPU sınırına tabi olmak çok yaygındır. Ayrıca, HoloLens veya Oculus Quest gibi mobil karma gerçeklik platformları, mobil sınıf CPU & GPU işlem gücü ile sınırlı olacaktır.

GPU'ya odaklanırken genellikle bir uygulamanın her kareyi tamamlaması gereken iki önemli aşama vardır.

  1. Köşe gölgelendiricisini yürütme
  2. Piksel gölgelendiricisini yürütme (parça gölgelendiricisi olarak da bilinir)

İşlem hatlarını işleme & bilgisayar grafiklerinin karmaşık alanına derinlemesine bakmadan, her gölgelendirici aşaması GPU üzerinde çalışan bir programdır ve aşağıdakileri oluşturur.

  1. Köşe gölgelendiricileri, ağ köşelerini ekran boşluğundaki koordinatlara dönüştürür (yani köşe başına yürütülen kod)
  2. Piksel gölgelendiricileri belirli bir piksel ve mesh parçası için çizecek rengi hesaplar (yani piksel başına kod yürütme)

Performans ayarlama açısından, piksel gölgelendiricisindeki işlemleri iyileştirmeye odaklanmak genellikle daha verimlidir. Bir uygulamanın yalnızca 8 köşe olacak bir küp çizmesi gerekebilir. Ancak, küp kaplayan ekran alanı büyük olasılıkla milyonlarca piksel sırasına göredir. Bu nedenle, gölgelendirici kodunun 10 işlemle azaltılması, piksel gölgelendiricisinde köşe gölgelendiricisine göre azaltıldığında önemli ölçüde daha fazla çalışma tasarrufu sağlayabilir.

Bu gölgelendirici genellikle benzer estetik sonuçlar elde ederken Unity Standard gölgelendiricisine kıyasla piksel & köşe başına çok daha az yönerge yürütürken MRTK Standart gölgelendiricisinden yararlanmanın birincil nedenlerinden biridir.

CPU İyileştirmeleri GPU İyileştirmeleri
Uygulama benzetimi mantığı İşleme işlemleri
Fiziği Basitleştirme Aydınlatma hesaplamalarını azaltma
Animasyonları Basitleştirme Çizilebilir nesnelerin sayısı & çokgen sayısını azaltın
Çöp Toplamayı Yönet Saydam nesnelerin sayısını azaltma
Önbellek Başvuruları İşlem sonrası/tam ekran efektlerinden kaçının

Çizim çağrısının yanı sıra

Unity'de performansı düşüren en yaygın hatalardan biri, çalışma zamanında malzeme kopyalamadır. GameObjects aynı malzemeyi paylaşıyorsa ve/veya aynı örgüyse , statik toplu işlem, dinamik toplu işlem ve GPU Instancing gibi teknikler aracılığıyla tek çizim çağrıları halinde iyileştirilebilir. Ancak geliştiricinin çalışma zamanında işleyicinin malzeme özelliklerini değiştirmesi durumunda Unity, atanan malzemenin kopya kopyasını oluşturur.

Örneğin, bir sahnede 100 küp varsa, bir geliştirici çalışma zamanında her birine benzersiz bir renk atamak isteyebilir. C# dilinde renderer.material.color dosyasının erişimi Unity'nin bu işleyici/GameObject için bellekte yeni bir malzeme oluşturmasını sağlar. 100 küpten her birinin kendi malzemesi olacaktır ve bu nedenle tek bir çizim çağrısında birleştirilemezler, bunun yerine CPU'dan GPU'ya 100 çizim çağrısı isteği olur.

Geliştiriciler bu engeli aşmak ve küp başına benzersiz bir renk atamaya devam etmek için MaterialPropertyBlock'ı kullanmalıdır.

private PropertyBlock m_PropertyBlock ;
private Renderer myRenderer;

private void Start()
{
     myRenderer = GetComponent<Renderer>();
     m_PropertyBlock = new MaterialPropertyBlock();
}

private void ChangeColor()
{
    // Creates a copy of the material once for this renderer
    myRenderer.material.color = Color.red;

    // vs.

    // Retains instancing capability for renderer
    m_PropertyBlock.SetColor("_Color", Color.red);
    myRenderer.SetPropertyBlock(m_PropertyBlock);
}

Unity performans araçları

Unity, düzenleyicide yerleşik olarak bulunan harika performans araçları sağlar.

Bir gölgelendirici ile diğer gölgelendirici arasındaki kaba performans dengesini tahmin ediyorsanız, her gölgelendiriciyi derlemek ve gölgelendirici aşaması başına işlem sayısını görüntülemek yararlıdır. Bu, bir gölgelendirici varlığı seçip Kod derle ve göster düğmesine tıklayarak yapılabilir. Bu, tüm gölgelendirici değişkenlerini derler ve visual studio'yu sonuçlarla birlikte açar. Not: Üretilen istatistik sonuçları, verilen gölgelendiriciyi kullanan malzemelerde hangi özelliklerin etkinleştirildiğine bağlı olarak değişebilir. Unity yalnızca geçerli projede doğrudan kullanılan gölgelendirici değişkenlerini derler.

Unity Standard gölgelendiricisi istatistikleri örneği

Unity Standart Gölgelendirici İstatistikleri 1

MRTK Standart gölgelendirici istatistikleri örneği

MRTK Standart Gölgelendirici İstatistikleri 2

Ayrıca bkz.

Unity

Windows Mixed Reality

Oculus

Mesh iyileştirmesi