Come ottenere e utilizzare il delta time


14

Ho topi che guardano e camminano nel mio gioco, ma sono molto lenti e difficili da usare. Penso che sia perché sto usando la velocità fissa. Ho sentito che nei grandi progetti gli sviluppatori usano delta time. Come posso calcolare il delta time in glut? Come posso calcolare la velocità usando il delta time?


Risposte:


18

Il "delta time" era il tempo trascorso tra due aggiornamenti di frame (ma può essere utilizzato anche in altri contesti, di solito è il risultato di una sottrazione di tempo).

Puoi ottenere il delta time in glut usando il metodo glutGet e il parametro GLUT_ELAPSED_TIME, oltre ad alcune operazioni.

La seguente riga restituisce il numero di millisecondi da quando è stato chiamato glutInit (o la prima chiamata a glutGet (GLUT_ELAPSED_TIME)):

int timeSinceStart = glutGet(GLUT_ELAPSED_TIME);

Quindi, se registri l'ora corrente, dal momento in cui inizia ad ogni ciclo di rendering, puoi conoscere il deltaTime sottraendo quello vecchio a quello nuovo.

int oldTimeSinceStart = 0;

while( ... )
{
     int timeSinceStart = glutGet(GLUT_ELAPSED_TIME);
     int deltaTime = timeSinceStart - oldTimeSinceStart;
     oldTimeSinceStart = timeSinceStart;

     //... stuff to update using deltaTime
}

Puoi anche farlo quasi allo stesso modo, usando la libreria ctime C / C ++ con clock () e l'espressione della costante macro CLOCKS_PER_SEC che specifica la relazione tra un tick di clock e un secondo.


Fondamentalmente, puoi usare deltaTime per aggiornare i tuoi movimenti in rapporto a questo tempo trascorso invece di usare un valore di tempo fisso. In questo modo, la velocità di movimento del tuo personaggio dovrebbe essere quasi la stessa se il tuo programma funziona a 60 fps o se funziona a 10 fps.


Ecco un piccolo esempio: supponiamo di voler spostare qualcosa di 10 unità al secondo sull'asse x. Potresti fare qualcosa del genere (se deltaTime usa davvero i millisecondi).

Position.x += 10/1000 * deltaTime;

In questo modo, indipendentemente dal fatto che il tuo programma sia aggiornato 2 volte o 100 volte, 1 secondo dopo, la posizione dovrebbe essere quasi la stessa e il gioco è meno influenzato dai bassi fps di un piccolo computer che se utilizza valori fissi.

  • Con valori fissi ==> basso fps = meno aggiornamenti = movimenti lenti mentre alto fps = più aggiornamenti = movimenti molto veloci.

  • Con deltaTime ==> "quasi" gli stessi movimenti.


Infine, dovresti leggere il passo del tempo fisso contro il passo del tempo variabile su gamedev.stackexchange.


Restituisce millisecondi come numero intero? Lordo, e forse non sufficiente. Ho sempre dovuto usare timer specifici per piattaforma e poi ho semplicemente evitato GLUT come la peste poiché non è eccezionale per i giochi.
Sean Middleditch,

@Sean Non uso neanche GLUT, ma era nel parametro della domanda, quindi ho risposto con questo in mente;) Tuttavia, sono incuriosito dalla tua posizione riguardo alla "insufficienza" di int per gestire i millisecondi nei giochi . A di positive intsolito salgono a 2.147.483.647 se firmati e fino a 4.294.967.295 se non firmati ... quindi anche se consideriamo quello più piccolo, 2.147.483.647 millisecondi è quasi 25 giorni ... Dovrebbe essere abbastanza per gestire la maggior parte dei giochi timer e anche se non è abbastanza possiamo ancora ragionevolmente usare unsigned int(~ 50 giorni) o anche un long long(come faccio di solito).
Valkea,

1
@Valkea Il punto non è il massimo, è la risoluzione nella fascia bassa. Poiché un singolo fotogramma a 60 FPS è di soli 16 2/3 ms, un'accuratezza di 1 ms (dal rappresentare i millisecondi come numeri interi) rappresenta un margine di errore di oltre il 5%, più che sufficiente per lanciare simulazioni lontano dal colpo. Un numero intero di microsecondi sarebbe sopportabile, ma i millisecondi sono troppo grossolani.
Steven Stadnicki,

Sì, hai bisogno di un tempo inferiore al millisecondo per molte cose e di un timer ad alta risoluzione per trovarlo, che GLUT non fornisce (che io conosco). Non è male solo scrivere un piccolo codice di piattaforma da utilizzare QueryPerformanceCountersu Windows e gettimeofdaysulla maggior parte degli altri. Dovrai sporcarti le mani e puntare a qualcosa di più del minimo comune denominatore di API della piattaforma, specialmente in C e C ++.
Sean Middleditch,

Una tale precisione non è utile per tutti i giochi. Tuttavia questa è una spiegazione molto interessante che risponde pienamente al mio interrogatorio sul tuo punto di vista riguardo a int e clock. Non ho mai avuto bisogno di un orologio ad alta precisione, ma immagino sia giunto il momento di approfondire la mia conoscenza della questione. Grazie;)
Valkea,
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.