2010-07-09 12 views
5

Actualmente estoy desarrollando un motor de juego C# .net xna.Rendimiento delegado C# en el juego xna

He estado tratando de encontrar una forma de tener un administrador de actualizaciones/programador/sistema de eventos. Actualmente estoy usando delegados para proporcionar una forma de crear tareas y eventos dinámicos programados.

Recientemente he leído que los delegados pueden ser lentos. Los delegados en mi juego están siendo invocados en cada frame y me pregunto si puede haber un golpe de rendimiento por eso.

Actualización:

Yo también acabo de encontrar esta http://blogs.msdn.com/b/shawnhar/archive/2007/07/09/delegates-events-and-garbage.aspx

Esto es lo que me preocupaba, y supongo que puede haber una manera de evitarlo. Gracias por toda la otra información.

+0

¿Escribe una microbanda pequeña y averígüese? – Brian

+0

En cuanto a su actualización, simplemente no recree los delegados cada 1/60 seg. Sin embargo, incluso si lo hiciera, todas las instancias estarían en Gen0 en el montón, y el GC es muy eficiente en la recopilación de Gen0. – codekaizen

+0

@codekaizen ¡Excepto que el GC en la Xbox no es generacional! –

Respuesta

8

No te preocupes, los delegados son un poco más lentos que una llamada a una función normal, pero a menos que los llames varios millones de veces por segundo, dudo mucho de que te des cuenta.

Sugiero quedarme con los delegados a menos que resulte ser un cuello de botella.

+0

Sí, solo deberían recibir llamadas a lo sumo 60 veces por segundo –

+0

Habrá una diferencia de microsegundos si es solo 60 veces/segundo. Dudo que noten mucha diferencia entre delegados y funciones si fue 6000 veces/s. –

+0

@Chris Sí, si es 60 veces por segundo, el impacto en el rendimiento será completamente insignificante. Si los delegados trabajan y mantienen el código simple y fácil de mantener, entonces opta por él. – mikera

1

independencia de si existe puede ser un impacto en el rendimiento, la mejor pregunta es si existe o no es un impacto en el rendimiento. Debe medir el rendimiento de la aplicación con y sin delegados para determinar si cualquier impacto en el rendimiento es aceptable.

+0

Lo haré y le haré saber –

1

Obviamente hay algo de impacto con una llamada de delegado frente a un método directo, pero con las versiones modernas (leer: publicar v1.1) del CLR, es casi tan rápido como una llamada a un método a través de una interfaz.

Aquí es una tabla de medidas aproximadas Potencia: http://msdn.microsoft.com/en-us/magazine/cc507639.aspx

Como siempre, usted debe medir para ver si el rendimiento es aceptable para usted. Como utilicé a los delegados en el código de rendimiento crítico (animación) y en los problemas no experimentados, espero que funcione bien para usted.

+0

¡Ya esa mesa ayuda gracias! –

1

Tus conjeturas (y nuestras suposiciones) no serán precisas, y no coincidirán necesariamente con el rendimiento real de tu juego. La única forma de saber el rendimiento real sería con al menos un tipo de perfil. Why measure when you can guess?

Además de obtener una medición real de su rendimiento, considere: ¿Importa? Si tu juego funciona a 60 fps (incluso disfruto a 30 fps en juegos de ritmo rápido, y puedo manejarlo a 20 fps si es más lento, como un juego por turnos) y eres capaz de alcanzar 300 fps en tiempo variable - el modo de paso, y los delegados le costará un total de 20 fotogramas (probablemente no, por cierto) ... su juego todavía puede mantener 60 fps en modo de paso de tiempo fijo.

1

Voy a hacerme eco de las respuestas de todos los demás aquí, en que los delegados no son un problema a menos que sean un problema, los perfiladores son sus amigos.

Una cosa a tener en cuenta es que podría ser ser un problema si está recreando los delegados cada cuadro, en cuyo caso, podría generar exceso de basura, lo que reducirá su rendimiento. Sin embargo, use herramientas como el perfilador CLR para determinar primero si esto es un problema para usted.