2011-04-07 10 views
7

Estoy tratando de hacer un juego pequeño como la aplicación que tiene cierta interacción, pero necesita un tiempo suficientemente preciso para evaluar el juego.¿Cómo obtener la hora actual en un juego de WPF? (No XNA)

Vi algunas versiones de Java usando este método llamado System.nanoTime.

¿Hay una versión .NET para ello?

Más importante aún, estoy buscando un tipo de temporizador que pueda usar para evaluar el mundo. ¿Debo utilizar un control de temporizador real y suscribirme a él?

También el juego evalúa en un subproceso diferente que el subproceso de interfaz de usuario. En caso de que esto haga la diferencia.

Respuesta

4

System.Threading.Timer tiene una resolución de 1 ms. Si necesita una resolución más alta, puede p/invocar QueryPerformanceFrequency() y QueryPerformanceCounter() en kernel32.dll

+3

clase StopWatch utiliza QueryPerformanceCounter internamente, sin necesidad de p/invocar .. – codymanix

+0

gracias Cody, no estaba al tanto de eso. –

1

Bueno, hay DateTime.UtcNow o DateTime.Now. Sin embargo, para procesos recurrentes, debe usar una de las clases de temporizador. El que generalmente se usa para wpf es DispatcherTimer.

3

Ha intentado

DateTime.Now; 

Esto le da la hora actual cada vez que la llame. Podrías obtenerlo en dos puntos diferentes y restar hora de finalización: hora de inicio para el intervalo de tiempo.

5

DateTime.Now no tiene una resolución real en el rango de nanosegundos. Un Tick es un "trozo" de 100 nanosegundos de tiempo, pero DateTime.Nowno resuelve cada Tick. Creo que la resolución más baja para DateTime.Now es 10 milisegundos o menos. Si llamas al DateTime.Now dos veces muy rápido, obtendrás la misma respuesta. Solo verás cómo avanza después de aproximadamente 10 milisegundos más o menos, dependiendo de en qué parte del ciclo lo estés llamando.

El Stopwatch class tiene una resolución más fina que DateTime.Now. Creo que se resolverá en milisegundos, lo que con suerte te dará la resolución suficiente para determinar si tu código de evaluación de juegos está funcionando lo suficientemente bien. Hay un gran ejemplo que contrasta el cronómetro frente a DateTime en el enlace proporcionado.

Además, el campo Frecuencia y el método GetTimestamp se pueden utilizar en lugar de las API Win32 no administradas QueryPerformanceFrequency y QueryPerformanceCounter.

+0

La clase de cronómetro realmente usará QueryPerformanceCounter bajo el cofre, si está disponible (vea el campo IsHighResolution). Por lo tanto, generalmente no es necesario usar el campo Frecuencia y el método GetTimestamp manualmente. – ollb

+0

@Gnafoo - Eso es lo que estaba tratando de transmitir. La intención del mensaje era que no necesita (no verá beneficios) de usar P/Invoke en kernal32.dll.Gracias por la claridad. –

+0

@Joan Venge: debe comenzar a marcar las preguntas como respondidas o la gente dejará de responder. Creo que hay varios sobresalientes en este momento. –

1

Utilice la clase StopWatch, utiliza QueryPerformanceCounter internamente, por lo que tiene una resolución muy fina. De esta forma no es necesario pinvoke/interoperacion.