2011-10-12 11 views
8

Im creando un juego simple de simulación de vehículos y proyectiles en WPF usando C#. Necesito tener una velocidad de fotogramas constante (es decir, necesito saber cuánto mover un objeto con una cierta velocidad en cada fotograma). De esta forma podría suscribir un evento que calcula y actualiza las posiciones de acuerdo con la física del juego para el evento CompositionTarget.Rendering.Velocidad de fotogramas constante en WPF para el juego

CompositionTarget.Rendering += UpdatePositions; 

Lo busqué en Google y no encontré respuesta. Los fps en WPF seem to be arbitrary, y el uso de un cronómetro para saber cuánto tiempo transcurrió entre un fotograma y el anterior no estaría limpio en absoluto.

Pensé también en crear mi propia velocidad de cuadros, llamando a UpdatePositions cada cierta cantidad de milisegundos y esperando que la representación ocurra en consecuencia y tenga una animación suave. Esto parece reinventar la rueda, y no puedo pensar en una forma de implementar esto de una manera limpia y simple.

Gracias!

+7

No use WPF para nada que no sea el desarrollo más básico del juego. Realmente no fue pensado para ese uso. Debería mirar en el marco XNA si está buscando crear un juego usando .NET. – dlev

+0

Creo que este es el desarrollo más básico del juego, y ya he trabajado mucho, así que realmente tengo que resolver mis problemas de framerate ... – Nicolas

+0

"usando un cronómetro para saber cuánto tiempo transcurrió entre un fotograma y el el anterior no estaría limpio en absoluto "- ¿cómo es eso? – EboMike

Respuesta

7

Es imposible conseguir una tasa de fotogramas constante en WPF. WPF se basa en la idea de velocidades de fotogramas dinámicas y esto lo hace casi inútil para cualquier desarrollo de juegos.

Parte de la información relacionada:

Why is Frame Rate in WPF Irregular and Not Limited To Monitor Refresh?

http://rhnatiuk.wordpress.com/2008/12/21/wpf-video-playback-problems/

Como otros han señalado la solución es, por desgracia, no utilizar WPF para el desarrollo del juego.

He trabajado mucho con animaciones WPF y es un dolor absoluto conseguir algo para animar suavemente en WPF (si quieres hacer esto, he escrito algunos best practices aquí).

Estoy seguro de que hay muchas otras razones por las que WPF no es bueno para el desarrollo de juegos. Un ejemplo es que no puede crear una aplicación de pantalla completa en WPF ya que las aplicaciones WPF siempre tienen ventanas. Esto significa que no puedes cambiar la resolución de tu juego para que sea fluido en pantalla completa, lo que significa que no puedes crear un juego de pantalla completa en WPF y esperar buenos resultados.

Si usted es serio sobre el desarrollo de su juego o juego en general y esto no es solo un prototipo o simplemente para divertirse, entonces le recomiendo que abandone WPF y use algo más; de lo contrario, simplemente se prepara para la decepción y calidad inferior a la normal

+0

en las mejores prácticas que digas: "El evento de edición de contenido de compilación hace que WPF animar continuamente. Si usa este evento, sepárelo en cada oportunidad ". ¿Qué quieres decir con desvincular el evento? Gracias – Nicolas

+0

simplemente significa que conectarse a CompositionTarget.Rendering no es óptimo, ya que puede afectar el rendimiento, incluso si no se hace nada en el controlador de eventos. MS recomienda separar/cancelar suscripción (CompositionTarget.Rendering- = Foo) cuando no sea absolutamente necesario escuchar el evento. –

+0

este consejo proviene directamente de MS: http://msdn.microsoft.com/en-us/library/bb613584.aspx –

2

Incluso si no quiere ir con XNA para el desarrollo del juego, considere leer sobre cómo se hace la gestión del tiempo allí: la velocidad de fotogramas fija no es necesaria ni igual a un tiempo de juego estable. Intenta basar tu física en el tiempo del juego (que puede ser el mismo en tiempo real o calculado en base a delatas en tiempo real, es decir, si quieres tener el modo "avance rápido" o pausar el juego) en lugar de velocidad de cuadros.

siguientes 2 enlaces discuten "tiempo de juego", "tiempo real" y los conceptos relacionados: http://blogs.msdn.com/shawnhar/archive/2007/07/25/understanding-gametime.aspx, http://blogs.msdn.com/shawnhar/archive/2007/11/23/game-timing-in-xna-game-studio-2-0.aspx

Cuestiones relacionadas