Rendimiento del juego XNA

Estoy escribiendo un juego usando C # 2010 y XNA 4.0. Quiero que sea un buen juego y no "una mierda más", así que uno de mis objetivos es un buen framerate. Para esto, me gustaría pedirles algunos consejos, ya sean relacionados con XNA o C #, ¿qué puedo hacer para acelerar mi código y así mejorar FPS?

Aquí hay algunas cosas que descubrí:

  • (c #) usando array insted de list<> mejorará mucho el rendimiento, en caso de que desee acceder a una gran cantidad de datos (o incluso a muchos: tener una matriz de 20000 elementos dio casi el 180% de FPS de la lista de 20000.
  • (c #) usando for en lugar de foreach mejorará el rendimiento. En los mismos 20000 elementos hay una diferencia de 5-10%.
  • (xna y c #) los métodos de llamada cuestan rendimiento, por lo que cuando distribuí mi código en métodos que llamaban a otros métodos y todo eso, y todo estaba tan bien y orientado a objetos, tenía un costo de 1-3 FPS por llamada.
  • (xna) update vs draw: no hubo diferencia en el rendimiento cuando puse el código en update () y draw (), así que si no te importa mucho, no tienes que poner algunos métodos en update () en lugar de mantener todo junto en draw () con la esperanza de un mejor FPS.
  • (xna) no tengo idea si soy yo o solo 4.0, pero cuando cargas un .X con muchas texturas y mallas bastante complejas, toma MUCHO tiempo cargar. Tuve que escribir mi propio cargador .X y renderizador de malla / modelo solo porque XNA comenzó a cargar textura para todos y cada uno de los triángulos, independientemente de si el anterior tenía la misma textura. Incluso escribir mi propio cargador de contenido que almacena texturas en caché no es una solución, porque todavía se utiliza muchas veces. Si haces algo agradable y esponjoso, te sugiero que uses drawuserprimitives y no Model clase. (no tengo idea si es solo 4.0, o si 3.1 también tuvo ese problema de rendimiento)
  • (xna y c #) Trate de evitar el uso de "nuevo" cuando se trata de dibujar. Vi algo de código en la web, lo que se copió / pegó y tenía "basicEffect = new BasicEffect (graphicsDevice);" y tanta fealdad en el dibujo (), y peor aún: en iteraciones dentro del dibujo (). Eso matará el rendimiento. En lugar de esto, tenga una de esas clases en "juego" o en una clase estática. Esto también se aplica a otros "objetos temporales": feo, pero creo que es mejor crear algo global y usarlo con atención que hacer un código agradable y esponjoso que hará que nuestro juego sea un recolector de basura.

Ok, para abreviar la historia, por favor publique algunos buenos consejos aquí, para que yo / nosotros podamos hacer juegos buenos, rápidos y optimizados;)

Gracias de antemano: Zéiksz

preguntado el 27 de agosto de 11 a las 22:08

Parece un buen candidato de CW :) -

Recomiendo hacer de esto una wiki comunitaria. -

No creo que usar una arquitectura OOP sólida cueste 1-3 fps cada llamada ... -

¿Qué tiene que ver el GC con esto? SI usa los mismos objetos, asignará la misma memoria, ya sea en una sola función o no. Las funciones no obtienen GC. -

Notaré que foreach puede usar una interfaz IEnumerawhatever <> dependiendo de la colección y que -puede- desencadenar un GC. Pero la parte de estructurar el código en métodos no tiene sentido. El compilador debería estar en línea donde sea apropiado, y podría forzarlo incluso si no lo hiciera. -

3 Respuestas

La optimización del software es un arte. Los mejores tipos de optimización son las pruebas basadas en estadísticas recopiladas.

Hasta que no tenga un problema, no optimice. ¿No crees que la jugabilidad del juego es más importante que esta métrica u otra? Mi sugerencia es hacer el juego primero y luego considerar dónde no funciona como le gustaría.

Luego, publique algunas preguntas específicas y estoy seguro de que obtendrá ayuda aquí sobre los problemas específicos.

Mientras tanto, sugiero que obtenga más información de los libros de desarrollo de juegos como los que se enumeran aquí: http://forums.create.msdn.com/forums/p/8642/45646.aspx.

XNA Extereme 101 - parece ser un tutorial interesante

Respondido 28 ago 11, 02:08

Estoy de acuerdo en que la optimización previa a la programación es un no-no. Pero creo que sería útil tener una pregunta / respuesta para las personas que se encuentran con este problema. - Erik Philips

@erik -Yo también estoy de acuerdo con eso. Es un buen lugar para recopilar esta información. - Preet Sangha

+1 Estoy completamente de acuerdo con esta respuesta. Las personas que se encuentran con problemas de rendimiento casi con certeza están haciendo algo muy mal y deben ejecutar un generador de perfiles para encontrarlo o publicar sobre el problema específico. Si tiene problemas, fusionar la mitad de las llamadas a sus métodos NO ayudará. - John McDonald

Gracias por el consejo, pero sigo pensando que saber algo antes de implementarlo de otra manera es mejor que optimizarlo después con la posible necesidad de una revisión. Hice mi pregunta para saber a qué prestar atención durante la programación. - Zéiksz

Mis 2 centavos valen:

No pongas todo tu código en un método porque crees que cuesta llamar a un método. Si PIENSAS que estás perdiendo 1-3 FPS llamando a un método vacío, probablemente no hayas terminado de investigar la pérdida 1-3 todavía. Para que esa pérdida sea cierta durante una llamada de método vacía, tendría que tener un FrameRate en MUCHOS miles ... donde no se preocuparía por una caída de 1-3.

FPS es una mala forma de juzgar el rendimiento en XNA. Cuando tiene habilitado el paso de tiempo variable, otros procesos en los que está involucrado el sistema operativo pueden influir en su velocidad de fotogramas. En su lugar, realmente necesitas crear un perfil. Solo concéntrese en la cantidad de tiempo que realmente lleva completar los métodos de actualización y / o extracción cronometrándolos con un objeto System.Diagnostic.Stopwatch. cronometralos individualmente, no juntos (muy importante).

La palabra clave 'nueva' no solo debe evitarse en la llamada de dibujo, sino en cualquier lugar tanto en la actualización como en el dibujo ... PARA tipos de referencia únicamente. Utilice la nueva palabra clave en cualquier momento y en cualquier lugar que necesite con los tipos de valor.

Respondido 28 ago 11, 04:08

UberGeekGames tiene un buen artículo sobre optimización XNA. Está dirigido principalmente a Xbox y WP7, pero muchas de las cosas también se aplican a la PC.

http://www.sgtconker.com/2011/05/high-end-performance-optimizations-on-the-xbox-360-and-windows-phone-7/

El sitio original está muerto, pero está disponible en Internet Archive:

Versión archivada de optimizaciones de rendimiento de gama alta en xbox 360 y windows phone7

La regla general es "perfilar antes de optimizar".

respondido 24 nov., 13:16

El sitio parece estar muerto el 24 de agosto. - Inisheer

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.