¿Cuál es el punto de "delta" en este código? ¿Refleja algo estándar en el desarrollo del juego?


24

Sé muy poco acerca de la programación de juegos, pero me gustaría aprender más. Estoy tratando de entender el código de este juego. Estoy tratando de entender por qué el código está pasando un "delta" a Shipcontrols.js, que cambia la dirección del barco en función de la entrada del usuario.

Básicamente, el juego calcula "delta" cada bucle ...

Aquí hay una versión abreviada de la pila que usa delta a través de un bucle ...

var delta = now - this.time;
this.time = now;
this.current.render.call(this.current, delta, this.renderer);  

Pasos hacia aquí ...

ctx.manager.add("game", scene, camera, function(delta, renderer)
{
if(delta > 25 && this.objects.lowFPS < 1000) this.objects.lowFPS++;
var dt = delta/16.6;
this.objects.components.shipControls.update(dt); 

Pasos hacia aquí ...

bkcore.hexgl.ShipControls.prototype.update = function(dt)
{
var pitchAng;
var yaw;
var roll;
if (undefined != hand){ 

Lo que hace cosas como esta ...

if(this.key.forward)
    this.speed += this.thrust * dt;
else

y esto...

if(this.key.right)
{
    angularAmount -= this.angularSpeed * dt;

¿Cuál es el punto del delta aquí? ¿Está tratando de introducir un elemento de aleatoriedad? El código para este juego es muy bueno. ¿Por qué este chico usa delta?


2
"¿Solo está tratando de introducir un elemento de aleatoriedad?" En realidad, todo lo contrario es cierto, el propósito del delta aquí es reducir la aleatoriedad y normalizar la física en el motor del juego.
zzzzBov

Respuestas:


27

Este es el "delta del tiempo". Es cuánto tiempo ha transcurrido desde la actualización anterior. Es necesario asegurarse de que las animaciones, la física, etc. se ejecuten a la velocidad correcta.

El código se ejecuta una vez por actualización de cuadro. Sin embargo, no hay garantía de que los cuadros se dibujen a una velocidad constante. Un cuadro puede tomar 1/60 de segundo y el siguiente puede tomar 1/30. Si no mide y tiene en cuenta esto, el juego será nervioso y se ejecutará demasiado rápido o demasiado lento en varias circunstancias.

Los deltas de tiempo a menudo se aplican en física, ya que así es como se especifican las ecuaciones para integraciones simples de Euler. La velocidad de integración en posición se define como la x1 = x0 + v * (t1 - t0)que se simplifica en código como x += v * dt. Por lo tanto, se requieren deltas de tiempo para evaluar las actualizaciones físicas.

Es muy, muy normal que se midan y apliquen los deltas de tiempo.


Creo que esta es la mejor respuesta porque explica que 'dt' puede variar mucho, por eso necesitamos interpolar cálculos físicos con él.
BiAiB

Vale la pena señalar que un problema importante con los deltas de tiempo en algunos contextos es que en muchos casos estarán "apagados" por un marco. Si algo hace que la actualización de un cuadro demore el doble de lo habitual, el delta aplicado al calcular las acciones de ese cuadro será el habitual, a pesar de que el cuadro no se mostrará hasta el momento en que los objetos deberían mostrarse dos veces más lejos como lo hicieron ellos. Si el tiempo entre ese fotograma y el siguiente es menor que el habitual (puede ocurrir si el temporizador intenta "ponerse al día", los dos fotogramas con menos tiempo del habitual entre ellos mostrarán ...
supercat

... una cantidad de distancia mayor a la habitual entre las posiciones del objeto).
supercat

@supercat: Eso es lo habitual de Fix Your Timestep . Sin embargo, aún necesita deltas de tiempo por cuadro para saber cuándo realizar una simulación fija.
Sean Middleditch

@SeanMiddleditch: como alguien que ha codificado juegos para el Atari 2600, me parece curioso que nadie haya lamentado el hecho de que en los sistemas modernos hay un retraso inevitable entre cuando el jugador mueve un controlador y cuando el personaje responde. En muchos juegos de Atari 2600, el control se sondea cada 16.7ms y las actualizaciones de los jugadores ocurren dentro de 1-16ms de eso (dependiendo de la posición vertical); El equipo moderno es incapaz de reaccionar tan rápido.
supercat

32

"Delta", "d" o "Δ" significa "diferencia" en un contexto matemático . Siempre que haya una diferencia de diferencia entre dos números con significados similares, esa diferencia puede llamarse "delta" o "d".

Los deltas son muy comunes en el desarrollo de juegos. Por ejemplo, la diferencia entre la coordenada X de un personaje hace un segundo y su coordenada X ahora se puede llamar "delta x", y comúnmente se denota como dx, delta_xo d_x.

Además, es muy común tener la diferencia entre dos veces, como lo tiene en su código:

var delta = now - this.time;

En este caso, esa variable denota la diferencia entre algún tiempo almacenado en this.timey el tiempo almacenado en now.

Los deltas se usan comúnmente para representar el cambio de algo en el tiempo. Entonces, por ejemplo, si sabe que la coordenada X de un jugador debe cambiar 5 píxeles cada fotograma, puede almacenar este cambio como un delta:

var delta_x = 5

Y luego use ese delta para aplicar el cambio cuando lo necesite:

player.x = player.x + delta_x

Pero recuerde que esto es solo una convención. Nadie lo obliga a nombrar sus variables "delta" o "d", pero hacerlo puede ayudar a otra persona que lea su código, o usted mismo si lo lee en el futuro, a comprender qué se supone que debe hacer la variable.

Otras letras griegas comunes ampliamente utilizadas en la programación son:

Epsilon : por un valor muy pequeño. Comúnmente utilizado al comparar coma flotante u otras variables con problemas de precisión:

const epsilon = 0.0001
...
if abs(some_float - other_float) < epsilon then
    -- close enough, let's say they're equal
end

Pi : para la constante homónima

Theta : para representar ángulos

Lambda : para representar funciones anónimas o cierres


1
También verá ciertos múltiplos de π, como 2π, π / 2, π / 4 y e (constante de Euler).
jzx

@Thomas: Claro, cualquier programa con base matemática traerá la notación teórica al código. Observe la oración "Otras letras griegas comunes ampliamente utilizadas en la programación son". " algunos códigos gráficos" difícilmente califican como "comunes" o "ampliamente utilizados". Nunca afirmé que estas son las únicas letras griegas que se pueden usar, ni que esos son los únicos significados que puede establecer para esas letras griegas.
Panda Pijama

@yzx: La última vez que lo revisé, la constante de Euler usó la letra latina "e". No estaba hablando de constantes matemáticas que aparecen en el código, sino de letras griegas comúnmente utilizadas en el código.
Panda Pijama

@PandaPajama He eliminado mi comentario ya que no es bienvenido.
Thomas

3
Si tus camaradas son particularmente modernos, incluso podrías ver Tau (τ) en lugar de 2π.
Kaz Dragon

3

dtrepresenta delta time. Se utiliza en el cálculo de la velocidad de fotogramas para asegurar que el juego se ejecute a la misma velocidad sin importar la velocidad de fotogramas.

framerate independencePuede encontrar más información sobre aquí .


3

dt (tiempo delta) es el tiempo entre cada ciclo / marco de renderizado (o cualquier marca de tiempo que desee) de su bucle. Con este tiempo delta podemos estirar ciertos valores con el tiempo. Al igual que en el mundo real, medimos ciertas propiedades físicas a lo largo del tiempo.

Digamos que ejecutamos nuestro juego 60 cuadros por segundo. Si queremos que nuestro jugador se mueva 5 píxeles por segundo, lo hacemos

 5 * (1/60); //Assuming we have a stable delta time of 0.016
 // (1/60) = 0.016 || 0.016 * 5 =  0.083 --> moved per frame || 60 frames * 0.083 = 5

o

 5 * (newTime - oldTime); //aka dt

El personaje se mueve 5 píxeles sobre 60 cuadros. Cuanto más tiempo tome su ciclo, mayor será el tiempo delta.

Para cada framerate (1/30, 1/25, etc.) el resultado será el mismo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.