2011-03-11 8 views
5

Aşağıdakilerin belirsiz bir soru olduğunun farkındayım, ancak XNA'da beklemediğim performans sorunlarım var.XNA, kaç tane (düşük poli) model kullanabilir?

Ekrana bir (yüksek!) Sayıda çizim yapmaya çalıştığım düşük bir poli modelim var (18 yüz ve 14 köşesi var). Bu modeli 5000+ kez çizene kadar 60'dan fazla FPS (iyi bir makinede) elde ediyorum. Burada çok mu soruyorum? En azından bu sayıyı (10-15k) iki katına çıkarmak veya üç katına çıkarmak isterim.

Modellerin fiili çizim kodum aşağıda verilmiştir. Çekme döngüsünden olabildiğince fazla hesaplamayı elimden gelmeye çalıştım, ondan daha fazla sıkılabiliyor mu yoksa daha iyi alternatifler mi var?

Not: tile.Offset, her döngüde değil, başlatma sırasında bir kez hesaplanır.

foreach (var tile in Tiles) 
     { 
      var myModel = tile.Model; 
      Matrix[] transforms = new Matrix[myModel.Bones.Count]; 
      myModel.CopyAbsoluteBoneTransformsTo(transforms); 

      foreach (ModelMesh mesh in myModel.Meshes) 
      { 
       foreach (BasicEffect effect in mesh.Effects) 
       { 
        // effect.EnableDefaultLighting(); 
        effect.World = transforms[mesh.ParentBone.Index] 
           * Matrix.CreateTranslation(tile.Offset); 
        effect.View = CameraManager.ViewMatrix; 
        effect.Projection = CameraManager.ProjectionMatrix; 
       } 
       mesh.Draw(); 
      } 
     } 

cevap

14

toplu iş limitine kesinlikle isabet ediyorsunuz. Ayrıntılar için bkz. this presentation ve this answer ve this answer. Basitçe ifade edin: Her saniye GPU'ya ne kadar çek çağrı yapılabileceğini gösteren bir sınır vardır.

Parti sınırı CPU tabanlı bir sınırdır, dolayısıyla 5000+ modelinize ulaştığınızda CPU'nuzun sabitlendiğini görebilirsiniz. Daha da kötüsü, oyununuz diğer hesaplamaları yaparken, bu partileri göndermek için mevcut CPU süresini azaltacaktır.

(Ve tersine, dikkat etmek önemlidir, neredeyse kesinlikle GPU sınırlarını isabet değil vardır. Henüz örgü karmaşıklığı konusunda endişelenmenize gerek yok.) Toplu iş sayısını azaltmak için çeşitli yollar

vardır . Frustrum itlaf birdir. Muhtemelen sizin durumunuza inandırmak için en iyi olanı Geometry Instancing, bu tek bir toplu işte birden fazla model çizmenizi sağlar. İşte bunu yapan bir XNA sample.

Daha da iyisi, eğer statik geometriyse, hepsini bir ya da birkaç büyük kafes haline getirebilir misiniz? Bilgilendirici olduğu için

+2

+1 Tam olarak ne söyleyebilirdim. XNA Örneğini kesinlikle tavsiye ederim, kendi modellerinizi çizmek için kolayca değiştirebilirsiniz. – Hannesh

+0

Teşekkür ederim! Bu doğru hakkında geliyor.Bu akşam işten eve döndüğümde önerilerinden birkaçı vereceğim ve performansın nasıl arttığını göreceksiniz (ve bunu cevap olarak işaretleyin!) – Necrototem

+1

Belirtilen sunum http: // ce'ye taşındı. .U-sys.org/Veranstaltungen/Interaktive% 20Computergraphik% 20 (Stamminger) /papers/BatchBatchBatch.pdf – 0xBADF00D

3

Herhangi bir performans sorununda olduğu gibi, belirli bir yaklaşımın çalıştığı sınırlar vardır. Sorunların nerede olduğunu ölçmeli ve görmelisiniz. En iyi seçenek profiler kullanmaktır, ancak CPU yüküne bakmak gibi temel ölçümler bile hangi darboğazlara sahip olduğunuzu gösterebilir.

İlk yatırım adımı olarak tüm hesaplamaları (matris çarpımları gibi) kaldırmanızı ve iyileştirmeler almanızı öneririz. Bu, CPU'nun hala GPU'dan daha fazla iş yaptığı anlamına gelir.

Hata ayıklama oluşturmada ölçümler yapmadığınızdan emin olun - CPU bağlıysa uygulamayı önemli ölçüde yavaşlatabilir.

Yan not: GPU, büyük çaplı işlemleri nispeten seyrek olarak gönderdiğinizde en iyi sonucu verir. Kodunuz az çok tersi yapar - çok sayıda küçük çizim isteği gönderin. İlkellerinizi toplu olarak yapabilmeli ve daha iyi performans gösterebilmelisiniz. Çok sayıda basit nesnenin (DirectX SDK'da olanlar dahil) nasıl oluşturulacağı ile ilgili örnekler vardır, "gpu rendering kalabalıkları" aramanız size başlangıç ​​noktası verebilir.

+0

+1. – Necrototem

İlgili konular