XNA'da Efekt parametrelerini ayarlamak için en iyi uygulama


13

EffectXNA'da parametreleri ayarlamak için en iyi uygulama olup olmadığını sormak istiyorum . Veya başka bir deyişle, tam olarak aradığımda ne olur pass.Apply(). Birden fazla senaryo hayal edebiliyorum:

  1. Her seferinde Applyçağrıldığında, tüm efekt parametreleri GPU'ya aktarılır ve bu nedenle ne sıklıkta parametre ayarladığımın gerçek bir etkisi yoktur.
  2. Her seferinde Applyçağrılır, sadece sıfırlanan parametreler aktarılır. Bu nedenle, aslında yeni bir değer ayarlamayan önbellekleme işlemlerinden kaçınılmalıdır.
  3. Her seferinde Applyçağrılır, sadece değiştirilen parametreler aktarılır. Yani Set-operasyonlarını önbelleğe almak işe yaramaz.
  4. Tüm bu sorular bootless çünkü bahsetme yollarından hiçbirinin oyun performansı üzerinde kayda değer bir etkisi yoktur.

Yani son soru: Küme işleminin önbelleğe alınmasının uygulanması aşağıdaki gibi yararlı mı?

private Matrix _world;
public Matrix World
{
    get{ return _world; }
    set 
    {
        if (value == world) return;
        _effect.Parameters["xWorld"].SetValue(value);
        _world = value;
    }
}

Beklediğiniz için teşekkür ederim.


DirectX etiketini, XNA'dan daha düşük düzeyli işlevsellik temelinde ekledim.
Andrew Russell

Eldeki konunun ÇOK uygulanabilir olduğuna dair kanıt buldum. Efekt parametrelerinizi nasıl ayarladığınız konusunda akıllıysanız, çizim çağrılarının sayısını (CPU'da ne kadar hızlı işlendiklerini) iki kattan fazla artırabilirsiniz. Hala bunu test etme aşamasındayım, sorumu burada okuyabilirsiniz: gamedev.stackexchange.com/questions/66932/…
cubrman

Yanıtlar:


8

Tüm bunlar CPU tarafında olur, bu yüzden önbellekleme kullanışlı bir özellik olsaydı , grafik sürücüsünün kendisini uygulayacağını tahmin ederim. Kendi önbellekleme katmanınızı eklemek gereksizdir.

Anladığım kadarıyla, bir parametre ayarladığınızda ve her aradığınızda Apply, bu çağrılar büyük ölçüde olduğu gibi DirectX'e ve daha sonra olduğu gibi kullanıcı modu GPU sürücüsüne iletilir. Kullanıcı modu sürücüsü daha sonra istediği her şeyi yapabilir . Üç senaryonuz da mümkündür.

(Senaryo # 2 bir olasılık olduğundan, muhtemelen değişmeyen parametreleri kasıtlı olarak yeniden ayarlamak için koşmamak en iyisidir .)

Dürüst olmak gerekirse, tipik bir sürücünün ne yaptığından emin değilim. Çoğunlukla bir sorun olarak ortaya çıkmadığı için. Hiç kimse darboğaz etkisi parametre ayarı olan duymadım. Belki teoride olabilir. Ama endişelenecek çok daha yaygın şeyler var .

Kesinlikle performansınızı ölçmeden ve neler olduğunu anlamadan böyle optimizasyonları uygulamaya başlamayın.

Ayrıca, bir Matrixile karşılaştırmak ==kötü voodoo olduğunu. Bir Matrixoluşur floats ve kayan nokta eşitlik karşılaştırmalar birçok durumda başarısızlığa yatkındır.

Ve genel olarak konuşursak, model if(x != y) x = y;basitçe olduğundan daha yavaştır x = y.


Sürücünün bunu önemsemesi ilginç bir nokta. Bağlantı için teşekkürler (ve yeniden bağlantılar).
0xBADF00D

Geçenlerde gelen Geometri örneklemeyi örnek geldi msdn . Aynı render'leri (aynı değerlerle) kare başına birden çok kez sıfırlamak, render işlemini iki veya üç kez önemli ölçüde yavaşlatır. Bu nedenle, devlet harmanlama deferratif olarak faydalıdır. Ne yazık ki bu durumun hava efekt parametrelerinin ayarlanması için de geçerli olduğundan emin değilim. Ama bilgilerimi paylaşmak istiyorum.
0xBADF00D

4

Bu konu hakkında bulduğum ilginç bir şey.

Msdn'den:

Herhangi bir efekt parametresine erişmek için Efekt üzerindeki Parametreler dizine eklenen özelliğini kullanabilirsiniz, ancak bu EffectParameters kullanmaktan daha yavaştır. Bu nedenle, sık sık değişen her efekt parametresi için bir EffectParameter oluşturmanız gerekir.

ve

Effect'inizdeki her teknik için bir EffectParameter örneği oluşturmak ve atamak, Effect'te Parameters indexed özelliğini kullanmaktan önemli ölçüde daha hızlıdır .

Bu _effect.Parameters["xWorld"].SetValue(value);fark edilir şekilde daha yavaşwordlParam.SetValue(value);

Yani muhtemelen böyle parametreleri önbelleğe almalısınız:

public EffectParameter wordlParam;
wordlParam = _effect.Parameters["xWorld"];

Ama gerçek bir ölçüt bulamadım.

Kaynaklar:

http://msdn.microsoft.com/tr-tr/library/Microsoft.Xna.Framework.Graphics.EffectParameter%28v=xnagamestudio.40%29.aspx http://msdn.microsoft.com/en-us/library /bb976060%28v=xnagamestudio.31%29.aspx


Bunu Monogame ve WP emülatöründe test ettim - gerçekten önemli bir fark olduğunu doğrulayabilirim (benim durumumda% 5-15 arasında). Performansa yardımcı olacak daha fazla numara var mı?
Konrad
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.