Delta-time e independencia de tasa de fotogramas (framerate)

Favourite 296 favourites
Tutorial written by AshleyOriginally published on 10th, October 2011 - 10 revisions

Translation Team:

2 total revisions
Just so you know: The English version has been updated since this translation has been published

Los juegos con framerate independent (independencia de tasa de fotogramas), son juegos que corren a la misma velocidad, no importa la velocidad de fotogramas. Por ejemplo, un juego puede correr a 30 FPS (Fotogramas Por Segundo) en una computadora lenta, y 60 FPS en una rápida. Un juego con independencia de tasa de fotogramas se procesa a la misma velocidad en ambas computadoras (los objetos parecen moverse a la misma velocidad). Por otra parte, un juego con framerate dependent (dependencia de fotogramas) se procesa a la mitad de la velocidad en una computadora lenta , en una especie de efecto de cámara lenta. Haciendo juegos con independencia de tasa de fotogramas, es importante asegurarse de que el juego sea divertido y jugable para todos, no importa el tipo de equipo que tengan. Los juegos que se ponen lentos cuando la tasa de fotogramas baja pueden afectar gravemente al modo de juego, por lo que los jugadores se sentirían frustrados y se salgan!

Este tutorial describe como puedes hacer tu juego con independencia de fotogramas. La misma técnica también permite time scaling (escalado de tiempo), lo cual permite deliberadamente slow-motion effects (efectos de cámara lenta) y pausing (pausa sencilla).

La expresión de sistema dt

La clave para la independencia de tasa de fotogramas es la expresión de sistema dt. dt significa: delta-time (Tiempo delta). Delta significa un cambio en una cantidad, así que delta-time significa un cambio en el tiempo. Este es el tiempo, en segundos, desde el último tick (fotograma).

Por ejemplo, a 100 fps dt será 0,01 (centésimas de un segundo), y a 10 fps dt será 0,1 (una décima parte de un segundo). En la práctica, dt varía tick a tick (fotograma a fotograma), por lo que es poco probable que sea exactamente el mismo valor durante largos períodos de tiempo.

Ten en cuenta que si añade dt a una variable por cada tick (fotograma), este se agrega 1 cada segundo, porque el tiempo entre todos los ticks (fotogramas) durante un período de 1 segundo se debe sumar 1! Aquí hay un ejemplo mostrando precisamente eso. (Agregando dt a una variable de instancia de un objeto es también una manera útil de tener un contador de tiempo en un objeto.)

¿Cómo usar dt?

Por lo general, el movimiento dependiente de la tasa de fotogramas se hace con un evento como este:

Framerate dependent motion
Cada tick (una vez por fotograma), el objeto se mueve un píxel a la derecha. Ten en cuenta que a 30 FPS esto significa 30 píxeles por segundo, y a 60 FPS esto significa 60 píxeles por segundo. Son diferentes velocidades, dependiendo de la tasa de fotogramas.

Recuerda en el ejemplo anterior que dt siempre agrega hasta 1 por cada segundo. Así que si cambiamos el evento a lo siguiente:

Framerate independent motion
... el objeto se mueve hacia la derecha a 60 píxeles por segundo en cualquier tasa de fotogramas. Ya que dt agrega hasta 1 por segundo, 60 *dt agrega hasta un máximo de 60 por segundo. Esto significa que a 30 FPS y 60 FPS nuestro objeto se mueve a la derecha 60 píxeles por segundo - la misma velocidad, independientemente de la tasa de fotogramas.

Usa dt en todas partes

Cada vez que tu mueves un objeto a una velocidad constante, es necesario utilizar dt de esa manera para lograr la independencia de velocidad de fotogramas. Por ejemplo,Sprite's Move forward (Sprite Mover hacia adelante) acción tiene un número de píxeles para mover el objeto hacia adelante. Si tu constantemente mueves el objeto hacia adelante, tu pudieras moverlo hacia adelante 60 * dt píxeles para moverlo a 60 píxeles por segundo en su ángulo actual.

Behaviors (Comportamientos) ya utilizan dt


Todos los Behaviors (Comportamientos) de Construct 2 Usan dt en sus cálculos de movimiento interno. Eso significa que cada objeto movido por Behaviors (Comportamientos) como Plataform (Plataforma) y 8 Direction (8 direcciones) no necesitan ningún tratamiento especial - ya lo hacen!
Tenga en cuenta quePhysics es una excepción. Por defecto no utiliza dt, y por lo tanto es dependiente de la velocidad de cuadro (framerate). Esto se debe a dt suele tener pequeñas variaciones aleatorias. Estas variaciones pueden hacer que una misma configuración en un juego de física den resultados diferentes, incluso si la misma cosa se hace dos veces. Esto suele ser molesto para los juegos con física, así que por defecto es dependiente del cuadro por segundo (framerate). Sin embargo, puede habilitar el uso de dt utilizando el Set SteppingMode acción física sobre on start of layout, y elegir la (framerate) velocidad de fotogramas independiente. Nota en este modo todavía el paso de tiempo máximo para la física es 1/30 (aproximadamente 33ms), porque el uso de un gran paso de tiempo (timestep) puede causar inestabilidad en simulaciones físicas.

Timescaling

escala del tiempo
Una característica realmente cool en Construct 2 es timescaling . Esto le permite cambiar el paso del tiempo en el juego, también conocido como el (escala de tiempo) time scale. Puede establecer la escala de tiempo del sistema con la acción (Fijación Escala de Tiempo) Set Time Scale. Una escala de tiempo de 1 significa que la velocidad normal. 0.5 significa que la mitad de rápido, y 2.0 significa el doble de rápido. Si se establece la escala de tiempo de su juego para 0.1, este iría diez veces más lento pero aún así con movimientos suaves - un (slow-motion )efecto de cámara lenta agradable!
Timescaling funciona cambiando el valor devuelto por dt. Esto significa que los comportamientos (behaviors ) se ven afectados, y cualquier movimiento usando dt. Si usted no utiliza dt en sus cálculos de movimiento (como el primer evento anterior) el movimiento no se ve afectado por la escala de tiempo! Así que para utilizar la escala de tiempo, sólo tiene que utilizar dt correctamente en todos los movimientos.

Pausing

Puede establecer la escala de tiempo a 0. Esto detiene todo movimiento. Es una manera fácil de hacer una pausa en el juego. Ajuste de nuevo a 1 y el juego se reanudará.
Usted puede notar que todavía puede hacer cosas como disparar utilizando los controles del juego. Usted puede poner sus principales eventos del juego en un grupo, y activar/desactivar ese grupo mientras hace una pausa y Reanudar.
También es una buena manera de probar que ha usado dt correctamente. Si lo ha utilizado correctamente, ajustar de la escala de tiempo a 0 hará que se detenga todo en el juego. Si usted no lo ha usado correctamente, algunos objetos podrían continuar moviéndose, a pesar de que se supone que el juego se detuvo! En ese caso, se puede comprobar cómo esos objetos se mueven, y asegúrese de que está utilizando dt correctamente.

Other kinds of movement

(Otros tipos de movimiento)
Es importante darse cuenta de que dt debe ser utilizado para todo tipo de movimiento. Esto incluye la rotación y la aceleración.

Rotación

(Rotación)
Al igual que antes, el siguiente evento gira el cochinito 1 grado cada fotograma:

Framerate dependent rotation
Esto es 30 grados por segundo a 30 FPS y 60 grados por segundo a 60 FPS - de nuevo, diferentes velocidades para diferentes (framerates) tasas de fotogramas. Usando dt de la misma manera soluciona el problema de nuevo. De esta manera el cochinito rota a 60 grados por segundo, independientemente de la tasa de fotogramas:

Framerate independent rotation

Acceleration

(Aceleración)
La aceleración también es bastante sencilla. Por lo general, esto sólo se aplica cuando se está haciendo un (custom movement) movimiento personalizado a través de un evento.

Si usted tiene una velocidad variable, el objeto se mueve a Object.Speed * dt píxeles por fotograma. Por lo tanto, la variable de velocidad de su objeto contiene una velocidad en píxeles por segundo.

Suponga que quiere acelerar el objeto por 100 píxeles por segundo sobre un segundo. Usted sólo tendrá que añadir 100 * dt a la variable la velocidad del objeto cada fotograma, y va a acelerar de manera independiente en (framerate) fotogramas. En otras palabras, utiliza dt tanto para ajustar la posición del objeto, y para ajustar la velocidad del objeto.

Errores comunes


Nunca utilice dt en la condición (Cada X segundos) Every X seconds! Un evento como ( Cada 1 segundo ) Every 1 second se ejecutará cada 1 segundo, independientemente de la velocidad de fotogramas, por lo que ya el framerate es independiente. La condición mide el tiempo, no fotogramas. Si haces un evento como Every 60 * segundos dt, han hecho sin darse cuenta la condición de framerate dependiente - lo contrario de lo que quiere lograr! Tal condición se ejecutará cada 6 segundos a 10 FPS (cuando dt = 0,1), o cada 0,6 segundos a 100 FPS (cuando dt = 0,01), y si usted sólo tiene que utilizar Every 6 segundos , que ya se ejecuta cada 6 segundos, independientemente de el framerate.

Consideraciones avanzadas

Mínimo framerate

A una tasa de fotogramas muy bajas, dt puede llegar a ser muy grande. Por ejemplo, a 5 FPS, dt es 0,2. Por tanto, un objeto que se mueve a 500 píxeles por segundo se mueve 100 píxeles por fotograma. Esto puede causar que se "teletransportarse" a través de paredes o perdida de colisiones con otros objetos.
Los juegos por lo general son injugables con tasas de fotogramas bajas (low framerates), pero es aún peor si se vuelven inestables. Para ayudar al juego de mantenerse fiable incluso a una tasa de fotogramas muy bajas, Construct 2 no deja dt que sea mayor que 0,1. En otras palabras, por debajo de 10 fps, dt permanece en 0,1. Esto quiere decir que por debajo de 10 fps el juego comienza a entrar a un efecto de cámara lenta (descrito anteriormente como uno de los temas de los juegos que dependen del framerate), sin embargo esto es por lo general un mejor resultado que el problema de "objetos teletransportarse".

Variación aleatorea

Como se mencionó con la física, dt suele tener pequeñas variaciones aleatorias, y por lo general debido a los temporizadores imperfectos en la computadora. Al igual que con la física, esto también puede causar ligeras variaciones aleatorias en su juego. Sin embargo, por lo general el efecto es poco voluminoso y mucho menos notable que con la física. Se recomienda que siempre utilice dt en sus juegos al menos que se requiera de una precisión exacta (lo cual es raro).

Object time scales

(tiempo de escala en objetos)
Puede establecer una escala de tiempo de un objeto individual, a través de la acción system (Set object time scale) Establecer escala de tiempo de objeto . Esto le permite tener, por ejemplo, un juego corriendo en cámara lenta con una (time scale) escala de tiempo de 0,3, pero todavía tiene el jugador actuando a toda velocidad con una (time scale)escala de tiempo de 1. Esto se logra mediante el establecimiento de la escala de tiempo de 0,3, entonces el uso de Set object time scale para ajustar la escala de tiempo del jugador. La expresión sistema dt sólo se ve afectada por la escala de tiempo de juego. Los objetos tienen su propio expresiones dt (por ejemplo, Player.dt ) lo cual tú debes usar en vez del sistema dt para todo el movimiento en relación con ese objeto. De esta manera, ahora hay dos valores de dt: uno para el juego, y uno para el jugador. Puesto que devuelven diferentes valores, diferentes partes del juego pueden progresar a diferentes tasas de fotogramas.

En este ejemplo, para devolver al jugador atras en el tiempo del juego, utiliza la acción Restore object time scale ( Restaurar escala de tiempo de objeto).

Conclusión

Es importante diseñar el juego desde el principio utilizando dt. Esto mejora la jugabilidad, lo que garantiza que el ritmo nunca se ralentiza en partes especialmente intensas del juego. Como bono adicional, también puede utilizar la característica time scaling (escala de tiempo ), fácilmente pause ( pausar el juego), e incluso controlar las escalas de tiempo individuales del objeto.
No hay que olvidar los behaviors (comportamientos) ya utilizan dt (excepto con la Physics en el que deberá activarlo usted mismo). Si utiliza behaviors(comportamientos) para controlar todo el movimiento en su juego, usted no tiene que preocuparse de dt en absoluto! Sin embargo, la mayoría de los juegos tienen un poco de movimiento controlado por evento, y es importante recordar cómo hacerlo framerate independiente.

Unlock your full gamedev potential

Upgrade to the Personal Edition of Construct 2, it has way more features and won't holding back from making money and using your full creativity like the free edition does. It's a one off payment and all Construct 2 editor updates are free for life!

View deals

Plus, it's got a lot of additional features that will help you save time and make more impressive games!

Congratulations on finishing this tutorial!

Did you learn a lot from it? Share it now with your friends!

Share and Copy this Tutorial

You are free to copy, distribute, transmit and adapt this work with correct attribution. Click for more info.

Leave a comment

Everyone is welcome to leave their thoughts! Register a new account or login.