2011-03-11 9 views
5

Soy consciente de que la siguiente es una pregunta vaga, pero estoy llegando a problemas de rendimiento que no anticipé en XNA.¿Cuántos modelos (de baja poli) puede manejar XNA?

Tengo un modelo de poli baja (tiene 18 caras y 14 vértices) que estoy tratando de dibujar en la pantalla un (alto) número de veces. Tengo más de 60 FPS (en una máquina decente) hasta que dibujo este modelo más de 5000 veces. ¿Estoy pidiendo demasiado aquí? Me gustaría duplicar o triplicar ese número (10-15k) al menos.

Mi código para dibujar los modelos se muestra a continuación. He intentado eliminar la mayor cantidad posible de computación del ciclo de sorteo, ¿puedo extraer más de ella o mejores alternativas todas juntas?

Nota: tile.Offset se calcula una vez durante la inicialización, no en cada ciclo.

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(); 
      } 
     } 

Respuesta

14

Claramente está llegando al límite de lote . Vea this presentation y this answer y this answer para más detalles. En pocas palabras: hay un límite para la cantidad de llamadas de sorteo que puede enviar a la GPU por segundo.

El límite del lote es un límite basado en la CPU, por lo que probablemente verá que su CPU se fija una vez que llegue a sus más de 5000 modelos. Peor aún, cuando su juego está haciendo otros cálculos, reducirá el tiempo de CPU disponible para enviar esos lotes.

(Y es importante tener en cuenta que, por el contrario, usted es casi seguro que no golpear los límites de la GPU. No hay necesidad de preocuparse por la complejidad de malla todavía.)

Hay un número de maneras de reducir su cuenta de lotes . El sacrificio de Frustrum es uno. Probablemente el mejor a seguir en su caso es Geometry Instancing, esto le permite dibujar varios modelos en un solo lote. Aquí hay un XNA sample que hace esto.

Mejor aún, si se trata de geometría estática, ¿puedes simplemente hornear todo en una o varias mallas grandes?

+2

+1 Exactamente lo que hubiera dicho. Recomiendo mucho XNA Sample, realmente puedes modificarlo fácilmente para dibujar tus propios modelos. – Hannesh

+0

¡Gracias! Esto suena bien.Cuando llegue a casa del trabajo esta tarde, intentaré algunas de sus sugerencias y veré cómo mejora el rendimiento (¡y marque esto como una respuesta si lo hace!) – Necrototem

+1

La presentación mencionada fue trasladada a http: // ce .u-sys.org/Veranstaltungen/Interaktive% 20Computergraphik% 20 (Stamminger) /papers/BatchBatchBatch.pdf – 0xBADF00D

3

Como con cualquier problema de rendimiento, existen límites donde un enfoque particular funciona. Necesita medir y ver dónde están los problemas. La mejor opción es utilizar el generador de perfiles, pero incluso las mediciones básicas como mirar la carga de la CPU pueden mostrar qué bottlencks tienes.

Como primer paso de la investigación, recomiendo eliminar todos los cálculos (como las multiplicaciones de matrices) y ver que obtengas mejoras: esto significa que la CPU aún está haciendo más trabajo que la GPU.

Asegúrate de que no estás haciendo mediciones en la compilación de depuración; podría hacer que la aplicación sea significativamente más lenta si está unida a la CPU.

Nota al margen: la GPU funciona mejor cuando se envían operaciones grandes con relativa poca frecuencia. Tu código hace más o menos lo contrario: envía un gran número de solicitudes de dibujo muy pequeñas. Debería poder combinar sus primitivos y obtener un mejor rendimiento. Hay ejemplos sobre cómo representar una gran cantidad de objetos simples (incluidos los de DirectX SDK), buscar "multitudes de renderizado gpu" puede proporcionarle un punto de partida.

+0

+1 para ser informativo. – Necrototem

Cuestiones relacionadas