Qual è il punto di "delta" in questo codice? Riflette una cosa standard negli sviluppatori di giochi?


24

So molto poco sulla programmazione del gioco, ma vorrei saperne di più. Sto cercando di capire il codice per questo gioco. Sto cercando di capire perché il codice sta passando un "delta" a Shipcontrols.js, che cambia la direzione della nave in base all'input dell'utente.

Fondamentalmente il gioco calcola "delta" ogni ciclo ...

Ecco una versione abbreviata dello stack che utilizza delta attraverso un loop ...

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

Passa qui ...

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); 

Passa qui ...

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

Che fa cose come questa ...

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

e questo...

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

Qual è il punto di delta qui? Sta solo cercando di introdurre un elemento di casualità? Il codice per questo gioco è molto buono. Perché questo ragazzo ha usato delta?


2
"Sta solo cercando di introdurre un elemento di casualità?" In realtà è vero il contrario, lo scopo del delta è quello di ridurre la casualità e normalizzare la fisica nel motore di gioco.
zzzzBov

Risposte:


27

Questo è il "delta temporale". È quanto tempo è trascorso dall'aggiornamento precedente. È necessario assicurarsi che animazioni, fisica e così via funzionino alla giusta velocità.

Il codice viene eseguito una volta per aggiornamento del frame. Tuttavia, non esiste alcuna garanzia che i frame vengano disegnati a velocità costante. Un fotogramma potrebbe richiedere 1/60 di secondo e il successivo potrebbe richiedere 1/30 di secondo. Se non si misura e non si tiene conto di ciò, il gioco sarà nervoso e funzionerà troppo veloce o troppo lento in varie circostanze.

I delta del tempo sono spesso applicati in fisica poiché è così che vengono specificate le equazioni per le semplici integrazioni di Eulero. L'integrazione della velocità in posizione è definita come ciò x1 = x0 + v * (t1 - t0)che semplifica in codice come x += v * dt. Quindi, i delta del tempo sono necessari per valutare gli aggiornamenti della fisica.

È molto, molto normale che i delta siano misurati e applicati.


Penso che questa sia la risposta migliore perché spiega che 'dt' può variare molto, motivo per cui dobbiamo interpolare i calcoli della fisica con esso.
BiAiB

Vale la pena notare che un grosso problema con i delta del tempo in alcuni contesti è che in molti casi saranno "disattivati" da un frame. Se qualcosa fa sì che l'aggiornamento di un frame richieda il doppio del normale, il delta applicato durante il calcolo delle azioni di quel frame sarà il solito, anche se il frame non verrà visualizzato fino al momento in cui gli oggetti dovrebbero essere mostrati spostati il ​​doppio come hanno fatto. Se il tempo tra quel fotogramma e il successivo è più piccolo del solito (potrebbe verificarsi se il timer tenta di "recuperare", i due fotogrammi con meno tempo del solito tra di loro mostreranno ...
supercat

... una distanza maggiore del solito tra le posizioni dell'oggetto).
supercat

@supercat: questa è solo la solita roba Fix Your Timestep . Tuttavia, sono ancora necessari delta temporali per fotogramma per sapere quando eseguire una simulazione fissa.
Sean Middleditch,

@SeanMiddleditch: Come qualcuno che ha codificato i giochi per l'Atari 2600, trovo in qualche modo curioso che nessuno si sia lamentato del fatto che sui sistemi moderni c'è un inevitabile ritardo tra quando il giocatore muove un controller e quando il personaggio risponde. In molti giochi Atari 2600, il controllo viene eseguito il polling ogni 16,7 ms e gli aggiornamenti del giocatore avvengono entro 1-16 ms (a seconda della posizione verticale); le attrezzature moderne non sono in grado di reagire così rapidamente.
supercat

32

"Delta", "d" o "Δ", significa "differenza" in un contesto matematico . Ogni volta che c'è una differenza di differenza tra due numeri con significati simili, quella differenza può essere chiamata "delta" o "d".

I delta sono molto comuni nello sviluppo del gioco. Ad esempio, la differenza tra la coordinata X di un personaggio un secondo fa e la coordinata X ora può essere chiamata "delta x" ed è comunemente indicata come dx, delta_xo d_x.

Inoltre, è molto comune avere la differenza tra due volte, come nel tuo codice:

var delta = now - this.time;

In questo caso, quella variabile indica la differenza tra il tempo memorizzato in this.timee il tempo memorizzato in now.

I delta sono comunemente usati per rappresentare il cambiamento di qualcosa nel tempo. Quindi, ad esempio, se sai che la coordinata X di un giocatore dovrebbe cambiare 5 pixel ogni fotogramma, puoi memorizzare questa modifica come delta:

var delta_x = 5

E quindi usa quel delta per applicare la modifica ogni volta che ne hai bisogno:

player.x = player.x + delta_x

Ma ricorda che questa è solo una convenzione. Nessuno ti obbliga a nominare le tue variabili "delta" o "d", ma farlo può aiutare qualcun altro che legge il tuo codice, o te stesso se lo leggi in futuro, a capire cosa dovrebbe fare la variabile.

Altre lettere greche comuni ampiamente utilizzate nella programmazione sono:

Epsilon : per un valore molto piccolo. Comunemente utilizzato quando si confrontano in virgola mobile o altre variabili con problemi di precisione:

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

Pi : per l' omonima costante

Theta : per rappresentare gli angoli

Lambda : per rappresentare funzioni o chiusure anonime


1
Vedrai anche alcuni multipli di π, come 2π, π / 2, π / 4 ed e (costante di Eulero).
jzx

@Thomas: Certo, qualsiasi programma con basi matematiche inserirà la notazione teorica nel codice. Si noti la frase "Altre comuni lettere greche ampiamente utilizzate nella programmazione sono". " alcuni codici grafici" difficilmente si qualifica come "comune" o "ampiamente utilizzato". Non ho mai sostenuto che queste sono le uniche lettere greche che possono essere utilizzate, né che questi sono gli unici significati che puoi impostare per quelle lettere greche.
Panda Pajama,

@yzx: L'ultima volta che ho controllato, la costante di Eulero ha usato la lettera latina "e". Non stavo parlando di costanti matematiche che compaiono nel codice, ma piuttosto di lettere greche comunemente usate nel codice.
Panda Pajama,

@PandaPajama Ho cancellato il mio commento in quanto non è il benvenuto.
Thomas,

3
Se i tuoi compagni sono particolarmente alla moda, potresti persino vedere Tau (τ) invece di 2π.
Kaz Dragon,

3

dtsta per delta time. Viene utilizzato nel calcolo della frequenza dei fotogrammi per assicurare che il gioco funzioni alla stessa velocità, indipendentemente dalla frequenza dei fotogrammi.

Ulteriori informazioni su framerate independencesono disponibili qui .


3

dt (delta time) è il tempo che intercorre tra ciascun ciclo / fotogramma di rendering (o qualsiasi timestamp desiderato) del loop. Con questo delta time possiamo allungare determinati valori nel tempo. Proprio come nel mondo reale misuriamo nel tempo determinate proprietà fisiche.

Diciamo che eseguiamo il nostro gioco 60 frame al secondo. Se vogliamo che il nostro lettore si sposti di 5 pixel al secondo, lo facciamo

 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

Il personaggio sposta 5 pixel su 60 fotogrammi. Più tempo impiega il ciclo, maggiore sarà il tempo a disposizione.

Per ogni framerate (1/30, 1/25, ecc.) Il risultato sarà lo stesso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.