Pregunta

No he programado juegos para cerca de 10 años (Mi última experiencia fue DJGPP + Allegro), pero pensé que tenía que retirar XNA durante el fin de semana para ver cómo fue tomando forma.

Estoy bastante impresionado, sin embargo a medida que continúo para juntar las piezas de un motor de juego, tengo una (probablemente) la pregunta básica.

¿Cuánto debe usted confiar en C#'s Delegados y Eventos para conducir el juego?Como programador de aplicaciones, yo uso los delegados y eventos fuertemente, pero no sé si hay una sobrecarga significativa para hacerlo.

En mi motor de juego, he diseñado una "cámara de persecución" de todo tipo, que puede ser asociado a un objeto y, a continuación, vuelve a calcular su posición en relación con el objeto.Cuando el objeto se mueve, hay dos formas de actualizar el chase cam.

  • Tener un "UpdateCameras()" método en el bucle principal del juego.
  • El uso de un controlador de eventos, y tienen el chase cam suscribirse a objeto.OnMoved.

Estoy usando la última, porque me permite cadena de eventos juntos y muy bien automatizar gran parte del motor.De repente, lo que sería enorme y complejo obtener cayó a un puñado de 3-5 de la línea de controladores de eventos...Su belleza.

Sin embargo, si los controladores de eventos de disparo de cada nanosegundo llegar a ser una importante desaceleración, voy a quitarlo y vaya con el bucle de enfoque.

Ideas?

¿Fue útil?

Solución

Si se piensa en un evento como una lista de suscriptores, en su código todo lo que están haciendo es el registro de un suscriptor.El número de instrucciones necesarias para lograr que tiende a ser mínima en el CLR nivel.

Si quieres que tu código sea genérico o dinámica, entonces usted necesita para comprobar si algo está suscrito antes de llamar a un evento.El evento, con el delegado mecanismo de C# y .NET ofrece esto a muy bajo costo (en términos de CPU).

Si usted está realmente preocupado por cada ciclo de reloj, nunca escribir genérico/dinámica de juego de la lógica.Que es un trade off entre mantenible/configurable código y la velocidad.

Escribe bien, me gustaría favor eventos/delegados hasta yo podría demostrar que es un problema.

La única forma en que puedes realmente saber si es un problema para usted es por los perfiles de su código, que debe hacer de todos modos para cualquier desarrollo de videojuegos!

Otros consejos

Es importante darse cuenta de que los eventos en C# no están en cola de eventos asíncronos (como, por ejemplo, la cola de mensajes de Windows).Son esencialmente una lista de punteros a función.Para la generación de un evento no tiene peores consecuencias en el rendimiento de la iteración a través de una lista de punteros a función y llamando a cada uno de ellos.

Al mismo tiempo, darse cuenta de que a causa de esto, los eventos son sincrónicos.Si su evento escucha es lento, es lento para la clase elevar de los eventos.

La cuestión principal aquí parece ser:"¿Cuál es la sobrecarga asociada con el uso de C# Delegados y Eventos?"

Los eventos tienen poca sobrecarga significativa en comparación a una llamada de función.

El uso de los Delegados pueden crear implícito y por lo tanto oculta de basura.La basura puede ser una causa importante de los problemas de rendimiento, especialmente en la XBox360.

El código siguiente genera alrededor de 2000 bytes de basura por segundo (60 fps) en el formulario de EntityVisitor objetos:

    private delegate void SpacialItemVisitor(ISpacialItem item);

    protected override void Update(GameTime gameTime)
    {
        m_quadTree.Visit(ref explosionCircle, ApplyExplosionEffects);
    }

    private void ApplyExplosionEffects(ISpacialItem item)
    {
    }

Mientras evitar la generación de basura, los delegados están lo suficientemente rápido para la mayoría de propósitos.Debido a los peligros ocultos, prefiero evitarlos y uso de las interfaces de lugar.

En mi tiempo de trabajo real, he estado aprendiendo XNA demasiado.

En mi humilde opinión (o no tan humilde si usted pregunta a mis compañeros de trabajo) es que la sobrecarga de los controladores de eventos se sentirá abrumado por otros elementos en el juego, tales como la representación.Dado el uso intensivo de eventos en normal .Net programación sería el código subyacente está bien optimizado.

Para ser honesto, creo que va a una UpdateCameras método podría ser una prematura de optimización.El sistema de eventos que probablemente tiene más usos aparte de la cámara.

XNA fomenta el uso de interfaces, eventos y delegados de la unidad de algo escrito con ella.Echa un vistazo a la GameComponent las clases relacionadas con el cual esta configurado para usted.

La respuesta es, "por mucho que usted se sienta cómodo".

Para elaborar un poco, Si por ejemplo se toma y se heredan de la gamecomponent clase en un cameracontroller clase y añadir al Juego.Componente de la colección.A continuación, puede crear su cámara clases y agregarlos a su cameracontroller.

Esto hará que el cameracontroller a ser llamado con regularidad y ser capaz de seleccionar y activar la cámara adecuada o varias cámaras, si eso es lo que está pasando.

Aquí está un ejemplo de esto (Todos sus tutoriales son excelentes):ReoCode

Como un aparte, usted puede estar interesado en saber que Shawn Hargreaves, el desarrollador original de Allegro, es uno de los principales desarrolladores en XNA equipo :-)

Antes de entrar en lo que es el impacto de un evento en términos de rendimiento, primero debe evaluar si es o no es necesario.

Asumiendo que usted está realmente tratando de mantener un chase cam actualizado y no se trataba solo de un ejemplo, lo que usted está buscando no es un evento (a pesar de los acontecimientos podría hacer el truco igual de bien), si usted está siguiendo un avatar, es probable que se mueve la mayoría del tiempo.

Un enfoque que he encontrado muy eficaz es utilizar jerárquica de las transformaciones, en el caso de implementar de manera eficiente la cámara no ser el único objeto de beneficiarse con dicho sistema, el objetivo sería mantener la cámara en el espacio de coordenadas del objeto es de seguimiento.

Ese enfoque no es el mejor si usted desea aplicar algo de elasticidad a la velocidad y la forma en que la cámara realiza el seguimiento del objeto, por eso, lo mejor es utilizar una llamada de actualización, una referencia, y algunos básicos de la aceleración y la resistencia física.

Los eventos son más útiles para cosas que sólo pasan de vez en cuando, o que afectan a muchos aspectos diferentes de la aplicación, como un personaje de morir, probablemente muchos sistemas diferentes gustaría ser consciente de tal evento, matar a las estadísticas, el control de la IA, y así sucesivamente, en tal caso, mantener un seguimiento de todos los objetos que se han de comprobar constantemente si esto ha ocurrido es mucho menos eficaz que el evento y tener todos los interesados objetos sólo serán notificados cuando sucede.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top