UPS y FPS: ¿qué debo limitar y por qué?

11

Actualmente estoy escribiendo un juego usando C ++ y SDL2 y hay una cosa que me pregunto: ¿tiene sentido limitar mis cuadros por segundo (FPS) y / o mis actualizaciones por segundo (UPS)?

Tengo la idea de que si limitas el UPS, esencialmente controlas la velocidad del juego: si el jugador mueve 1px por actualización y siempre lo actualizas 30 veces por segundo, se moverá a una velocidad de 30px / sy tú Probablemente también alivie la CPU ya que la cantidad de cálculos por segundo disminuye. Si limita el FPS, la cantidad de llamadas por segundo disminuye, por lo tanto, alivia su GPU. Espero haber entendido todo eso correctamente, si no, no dudes en corregirme.

Mi pregunta es: ¿qué se supone que limite en mi juego? FPS? ¿UPS? ¿Ambos? ¿Ninguno? ¿Hay otro enfoque mejor para esto? ¿Cómo se hace esto en la mayoría de los juegos y por qué?

¡Las respuestas son muy apreciadas!

DocCoock
fuente
2
Realmente no es una respuesta, pero puede encontrar esto útil: gafferongames.com/game-physics/fix-your-timestep
Cypher

Respuestas:

10

Sí, tiene sentido.

Como dijiste, hará menos carga en el sistema, lo que es bueno para las térmicas y otras aplicaciones.

Sin embargo ... La lógica de tus juegos NO debería depender de las actualizaciones por segundo. Por lo tanto, te recomiendo que eches un vistazo a deltatime, lo que hará que tu juego sea independiente de las actualizaciones por segundo.

Te recomiendo que eches un vistazo a esta pregunta. Explica muy bien cómo calcularlo y usarlo. Cómo obtener y usar el tiempo delta

Espero que haya ayudado!

KaareZ
fuente
Entonces, ¿debería limitar ambos o solo uno de ellos?
DocCoock
Ambos, pero agregue una opción en la configuración para ajustar.
KaareZ
55
Una advertencia: si usa un motor de física, no confíe en el marco de actualización de tiempo / variable delta, ya que rara vez son compatibles; requieren el enfoque de marco fijo. Y si su marco fluctúa mucho, esto podría significar que tiene problemas con su software y debería preguntarse por qué sucede esto. Teniendo en cuenta esto, puede volver a considerar el uso del enfoque DT.
Vaillancourt
1
Tenga en cuenta que el uso de actualizaciones basadas en el tiempo delta puede generar inestabilidad física y errores muy difíciles de reproducir. En algunos juegos, hay trucos que solo son posibles a ciertas velocidades de cuadro. Es por eso que la física a menudo se ejecuta a una velocidad de cuadro fija. Siempre puede interpolar a tasas de actualización más bajas, pero si su simulación es inestable, nada puede ayudarlo.
Dietrich Epp
1
Honestamente, creo que deltatime no es una buena idea. Lo he usado durante años, y viene con dos problemas principales. Muchos artículos de multijugador diferentes recomiendan el uso de pasos de tiempo fijos y, si el tiempo delta es demasiado alto, puede teletransportarse a través de paredes o errores similares a menos que lo tenga en cuenta.
Programmdude
6

La mejor respuesta es: depende .

No tienes que limitar a ninguno

Actualizaciones : si sus actualizaciones no están vinculadas a un límite superior, entonces la lógica del juego debe depender de una cantidad de tiempo delta , para evitar ejecutar el juego más rápido o más lento dependiendo de la máquina donde se ejecuta. Este es un enfoque muy común utilizado por muchos juegos, pero no es el único.

Renderizado : si el renderizado no está vinculado a un límite superior, el framebuffer podría presentarse en un estado incompleto o erróneo, causando artefactos desgarrantes . Es por eso que muchos juegos emplean Sincronización vertical (v-sync)

Puedes limitar ambos

Actualizaciones : algunos juegos utilizan tiempos fijos para algunos o todos sus sistemas de juego. Este enfoque funciona tal como lo has descrito. El número de actualizaciones por segundo se limita a un límite superior para garantizar que las cosas no se muevan demasiado rápido en una máquina de primer nivel. Esto elimina la necesidad de temporización delta. Algunas aplicaciones son mejores con tiempos fijos, algunas con temporización delta. Elegir qué enfoque dependerá por completo de lo que exactamente está tratando de lograr. El libro en línea GameProgrammingPatterns tiene un capítulo dedicado a los bucles de juegos que toca ambas arquitecturas.

Renderizado : los cuadros por segundo deben establecerse en un límite superior para evitar el problema de rotura mencionado anteriormente, sin embargo, su aplicación no debe intentar hacerlo manualmente con algún bloqueo de CPU. En su lugar, habilite v-sync y deje que el hardware subyacente se sincronice con la frecuencia de actualización del monitor. Al hacer eso, su juego será compatible con futuros monitores que podrían operar en una frecuencia mucho más alta que la actual de 60Hz. También vale la pena señalar que muchos jugadores, en particular aquellos en benchmarking, aún prefieren correr sin v-sync para permitir la velocidad de fotogramas más alta posible. Por lo tanto, es sensato permitir habilitar o deshabilitar la función durante el tiempo de ejecución.

Lo que no debes limitar

Si su juego utiliza un enfoque basado en encuestas para la entrada del usuario, por ejemplo: llama a una getInput()especie de actualizar los estados del controlador durante el paso de actualización, entonces esto es mejor si no limitado. O, si está limitado, establezca un límite superior muy alto. Cuanto más a menudo consultes la entrada del usuario y actúes sobre ella, más ágil y sensible será el juego. Los llamados juegos de 60Hz que escuchamos hoy en día no están actualizando la inteligencia artificial y todos los estados del mundo a ese ritmo, algunos ni siquiera lo hacen tan rápido, pero consultan la entrada del controlador al menos 60 veces por segundo y actualizan el avatar del jugador en consecuencia. Concedido que esto solo es realmente relevante para los juegos de acción de ritmo rápido.

glampert
fuente
Sin embargo, mis actualizaciones también se limitan automáticamente cuando VSync está habilitado. Por lo tanto, aparentemente tengo que decidir entre el problema de desgarro y el problema de actualización de sondeo, ¿correcto?
DocCoock
@DocCoock, si su renderizador y la lógica del juego se ejecutan en el mismo hilo, sí, habilitar v-sync también corrige la frecuencia de actualización. Esa es una razón por la que algunos juegos segregan la representación y la lógica del juego a diferentes hilos.
glampert
1

Hay dos publicaciones que tal vez quieras echar un vistazo:

Arregla tu Timestep

Representación física interpolada

Encuentro que las discusiones en las publicaciones son realmente invaluables, pero en mi opinión tiene más sentido cuando hay una cantidad importante de simulación física en el juego. En resumen, la idea es que la simulación debe tener un paso de tiempo fijo (de lo contrario, la física podría explotar en algún punto donde el delta es demasiado grande), mientras que la representación debería tener libertad para ejecutarse a la velocidad máxima posible. Para sincronizar ambos (la simulación y la representación), el estado de representación se interpola por un factor que depende de qué tan lejos esté la simulación de la siguiente actualización (recuerde que la simulación es fija).

Espero eso ayude.

Francis Moy
fuente