¿Cómo mantiene XNA una velocidad de cuadro de 60 FPS consistente y precisa? Además, ¿cómo mantiene un tiempo tan preciso sin vincular la CPU al 100%?¿Cómo funciona el tiempo XNA?
Respuesta
No sé específicamente cómo lo hace XNA, pero cuando jugaba con OpenGL hace unos años conseguí lo mismo usando un código muy simple.
en el meollo de ella, supongo que XNA tiene algún tipo de ciclo de renderizado, puede o no puede integrarse con un ciclo de procesamiento uniforme estándar pero, por el bien del ejemplo, supongamos que no lo es. en este caso podrías escribir algo como esto.
TimeSpan FrameInterval = TimeSpan.FromMillis(1000.0/60.0);
DateTime PrevFrameTime = DateTime.MinValue;
while(true)
{
DateTime CurrentFrameTime = DateTime.Now;
TimeSpan diff = DateTime.Now - PrevFrameTime;
if(diff < FrameInterval)
{
DrawScene();
PrevFrameTime = CurrentFrameTime;
}
else
{
Thread.Sleep(FrameInterval - diff);
}
}
En realidad, es probable que usar algo como Environment.Ticks en lugar de DateTime (sería más exacto), pero creo que esto ilustra el punto. Esto solo debería llamar a drawScene aproximadamente 60 veces por segundo, y el resto del tiempo el hilo estará durmiendo para que no tenga ningún tiempo de CPU.
Pero al usar Thread.Sleep, ¿no depende de la programación de hilos? Eso parece ser ligeramente predecible en el mejor de los casos. Eso es lo que me hizo preguntarme cómo están siendo tan consistentes. – redman
utilizando thread sleep lo deja a merced del planificador, pero a la larga debería promediar bastante bien, especialmente después de 60 fotogramas por segundo. Cuando se trata de sincronización de alta precisión en una computadora, está a merced del planificador de todos modos, porque su hilo siempre se puede intercambiar en cualquier momento. – luke
los juegos deben funcionar a 60 fps, pero eso no significa que lo harán. Eso es en realidad un límite superior para un juego lanzado.
Si ejecuta un juego en modo de depuración, puede obtener cuadros mucho más altos por segundo; por ejemplo, una plantilla de inicio en blanco en mi computadora portátil en modo de depuración funciona a más de 1,000 fps.
Dicho esto, el framework XNA en un juego lanzado hará todo lo posible para ejecutar a 60 fps, pero el código que incluyó en su proyecto tiene la posibilidad de reducir ese rendimiento. Por ejemplo, tener algo constantemente disparado en la recolección de basura normalmente vería un chapuzón en el fps del juego, o arrojando algunas matemáticas complejas en los métodos de actualización o dibujo, haciendo que disparen cada fotograma ... lo que normalmente sería un poco excesivo. Hay una serie de cosas a tener en cuenta para mantener su juego lo más eficiente posible.
Si está preguntando cómo el marco XNA hace que ese techo suceda, eso realmente no puedo explicarlo, pero puedo decir que dependiendo de cómo diseñe su código, y lo que puede hacer definitivamente puede afectar negativamente a este número, y no siempre tiene que estar relacionado con la CPU. En el caso de la recolección de basura, es solo la limpieza de una RAM que puede no mostrar un aumento en el uso de la CPU, pero podría afectar su FPS, dependiendo de la cantidad de basura y el intervalo que tiene que ejecutarse.
Se equivoca en algunas cosas en esta respuesta ... el modo de depuración causa MÁS sobrecarga, no menos. No es "casualidad" que el código ralentice el rendimiento; siempre lo hará. La recolección de basura siempre afecta la CPU, punto. –
Mientras código de Lucas anterior es derecho teórico de los métodos y propiedades que se utilizan no son las mejores opciones:
- Como la precisión de
DateTime.Now
es de sólo 30 ms (ver C# DateTime.Now precision y más o menos 20 ms) su uso para alta el tiempo de ejecución no es aconsejable (60 FPS son 16 ms). System.Diagnostics.Stopwatch es the timer of choice for real time .NET Thread.Sleep
sufre la misma precisión problema/resolución y no se garantiza que dormir durante el tiempo especificado solamente
El FX XNA actual parece enganchar en el bucle de mensajes de Windows y ejecutar su pre-actualización interna cada paso y llamando al Game.Update
solo si el tiempo transcurrido desde la última actualización coincide con la velocidad de fotogramas especificada (por ejemplo, cada 16 ms para la configuración predeterminada). Si realmente quiere saber cómo funciona el XNA FX, el trabajo Reflector es su amigo :)
Tidbit aleatorio: De vuelta en el XNA GameStudio 1.0 Marco de tiempo Alpha/Beta hubo bastantes publicaciones en el blog sobre el "ciclo perfecto de WinForms", aunque no las encuentro ahora ...
Puedes leer todo sobre cómo se implementó el temporizador XNA aquí Game timing in XNA Game Studio pero básicamente Intentaría y esperaría 1/60 de segundo antes de continuar el ciclo de nuevo, también tenga en cuenta que la actualización se puede llamar varias veces antes de un render si XNA necesita "ponerse al día".
- 1. XNA MathHelper.SmoothStep? ¿Como funciona?
- 2. XNA - Creando muchas partículas al mismo tiempo
- 3. XNA Change Game Service dinámicamente durante el tiempo de ejecución
- 4. ¿Cómo cargo una textura en XNA en tiempo de ejecución?
- 5. XNA en el iPhone
- 6. ¿Funciona el tiempo de Nullable?
- 7. ¿Cómo usar XNA en WPF?
- 8. ¿Cómo calcular correctamente FPS en XNA?
- 9. Edición colaborativa en tiempo real: ¿cómo funciona?
- 10. ¿Cómo dibujo líneas usando XNA?
- 11. ¿Cómo funciona el tiempo de espera de conexión del socket?
- 12. ¿Cómo funciona el protocolo de tiempo de red?
- 13. Python: ¿Por qué el tiempo de importación no funciona por tiempo() pero funciona para time.sleep()?
- 14. XNA game tutorial
- 15. XNA, X directa, OpenGL
- 16. Biblioteca UI para XNA
- 17. Retraso de animación Silverlight/XNA
- 18. Incrustar XNA en WinForms
- 19. Serializar XNA rectángulo con Json.NET
- 20. Usando system.windows.forms con XNA
- 21. XNA game performance
- 22. Controles XNA y GUI (p. Ej., Xaml y xna)
- 23. ¿Cómo cambiar el tamaño y guardar un Texture2D en XNA?
- 24. ¿Cómo configuro el tamaño de la ventana/pantalla en xna?
- 25. Rendimiento delegado C# en el juego xna
- 26. ¿Cuál es el mejor blog de XNA?
- 27. XNA: ¿Cuál es el punto de Descargar()?
- 28. El tiempo de Python Unix no funciona en Javascript
- 29. XNA sprite sort mode
- 30. XNA Target Audience
En general, me gustaría saber cómo funciona una temporización normal. –