2011-08-27 12 views
15

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

Aquí es algunas cosas que descubrí:

  • (C#) usando array insted de list<> mejorará mucho el rendimiento, en caso de que quiera acceder a la enorme cantidad de datos (o incluso lotes: tiene una matriz de 20000 artículos dio casi el 180% de FPS de la lista de 20000.
  • (C#) usando for en lugar de foreach mejorará el rendimiento. Por mismos 20000 elementos es como la diferencia 5-10%.
  • (XNA y C#) métodos de llamada costos de rendimiento, así que cuando dispersé mi código en meth Puso lo que se llamaba otros métodos y demás, y todo fue tan genial y orientado a objetos que fue en el costo de 1-3 FPS cada llamada.
  • (XNA) vs. actualización sorteo: no fue una diferencia en el rendimiento cuando pongo código en la actualización() y draw(), así que si no te importa mucho, usted no tiene que poner algunos métodos en la actualización() en lugar de mantener todo junto en draw() con la esperanza de un mejor FPS.
  • (XNA) ni idea de si se trata de mí o simplemente 4.0, pero cuando se carga un .X con muchas texturas en ella y mallas bastante complejas, se tarda mucho tiempo en cargar. Tuve que escribir mi propio cargador .X y renderizador de malla/modelo simplemente porque XNA comenzó a cargar la textura para cada triángulo independientemente de si el anterior tenía la misma textura. Incluso escribir mi propio cargador de contenido que almacena texturas en caché para usted no es una solución, porque todavía se utiliza muchas veces. Si haces algo agradable y esponjoso, sugiero usar drawuserprimitives y no Model clase. (Ni idea de si es 4.0 solamente, o 3,1 tenido tal problema de rendimiento también)
  • (XNA y C#) Trate de evitar el uso de "nuevo" cuando se trata de dibujo. Vi un código en la web, lo que se copió/pegó y tenía "basicEffect = new BasicEffect (graphicsDevice);" y tal fealdad en el sorteo(), y aún peor: en las iteraciones dentro de draw(). Tal matará el rendimiento. En lugar de esto, tenga una de esas clases en "juego" o en una clase estática. Esto se aplica a otros "objetos temporales" también: feo, pero creo que es mejor crear algo global y usarlo con atención para luego crear un código agradable y esponjoso que hará nuestro juego debido al recolector de basura.

Ok, así que para hacer el cuento largo, por favor enviar un buen consejo aquí, así que puedo/podemos hacer juegos buenos, rápidos y optimizados;)

Gracias de antemano: Zéiksz

+0

Parece un buen candidato para CW :) – BlackBear

+1

Recomiendo hacer de este un wiki de la comunidad. – Ben

+3

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

Respuesta

5

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

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

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

Archived version of High end performance optimizations on the xbox 360 and windows phone7

La regla de oro es "el perfil antes de optimizar".

+0

+1 Me gusta el sitio, gracias por compartir. –

+6

El sitio parece estar muerto desde el 24 AUG 12. – Inisheer

7

La optimización del software es una artesanía. Los mejores tipos de optimización son pruebas basadas en estadísticas recopiladas.

Hasta que no haya un problema no optimizar. ¿No crees que la jugabilidad del juego es más importante que esta métrica u otra? Mi sugerencia es hacer que el juego primero y luego considerar dónde no está funcionando como te gustaría.

luego publicar algunas preguntas específicas y estoy seguro de que obtendrá un poco de ayuda aquí en los temas específicos.

Por el momento sugiero que obtendrá 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 que hay un interesante tutorial

+0

Estoy de acuerdo en que la optimización previa a la programación es no-no. Pero creo que tener una pregunta/respuesta para las personas que están teniendo este problema sería útil. –

+0

@erik -Estoy de acuerdo con eso también. Es un buen lugar para recopilar esta información. –

+0

+1 Estoy completamente de acuerdo con esta respuesta. Las personas que están experimentando problemas de rendimiento casi seguramente están haciendo algo gravemente incorrecto y deberían ejecutar un generador de perfiles para encontrarlo o publicar sobre el problema específico. Si tiene problemas, fusionar la mitad de sus llamadas a métodos NO va a ayudar. –

7

Mis 2 centavos:

No poner todo el código en un método porque piensa que cuesta llamar a un método. Si PIENSAS que pierdes 1-3 FPS llamando a un método vacío, probablemente aún no hayas terminado de investigar la pérdida 1-3. Para que esa pérdida sea cierta durante una llamada a un método vacío, tendría que tener una FrameRate en MUCHOS miles ... en la que no se preocupe 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 con los que está involucrado el sistema operativo pueden influir en su velocidad de cuadros. Realmente necesitas hacer un perfil. Solo concéntrese en la cantidad de tiempo que lleva completar la Actualización &/o los métodos de sorteo asignándoles un objeto System.Diagnostic.Stopwatch. cronometrarlos individualmente, no juntos (muy importante).

La palabra clave 'nueva' no solo debe evitarse en la llamada al sorteo, sino en cualquier parte tanto en la actualización & dibujar ... SOLO para tipos de referencia. Use la nueva palabra clave en cualquier momento y en cualquier lugar que necesite con tipos de valores.