À quoi sert le «delta» dans ce code? Cela reflète-t-il une chose standard dans le développement de jeu?

24

Je connais très peu la programmation des jeux mais j'aimerais en savoir plus. J'essaie de comprendre le code de ce jeu. J'essaie de comprendre pourquoi le code passe un "delta" à Shipcontrols.js, qui change la direction du navire en fonction de l'entrée de l'utilisateur.

Fondamentalement, le jeu calcule "delta" chaque boucle ...

Voici une version abrégée de la pile qui utilise delta thru one loop ...

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

Entrez ici ...

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

Entrez ici ...

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

Ce qui fait des trucs comme ça ...

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

et ça...

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

Quel est le point de delta ici? Essaie-t-il simplement d'introduire un élément de hasard? Le code de ce jeu est très bon. Pourquoi ce type a-t-il utilisé Delta?

bernie2436
la source
2
"Est-ce juste essayer d'introduire un élément de hasard?" En fait, c'est exactement le contraire qui est vrai, le but du delta ici est de réduire le caractère aléatoire et de normaliser la physique dans le moteur de jeu.
zzzzBov

Réponses:

27

C'est le «delta temporel». C'est le temps qui s'est écoulé depuis la dernière mise à jour. Il est nécessaire de s'assurer que les animations, la physique, etc. fonctionnent à la bonne vitesse.

Le code s'exécute une fois par mise à jour de trame. Cependant, rien ne garantit que les images sont dessinées à une vitesse constante. Une image peut prendre 1 / 60e de seconde et la suivante peut prendre 1 / 30e. Si vous ne mesurez pas et ne tenez pas compte de cela, le jeu sera nerveux et fonctionnera trop rapidement ou trop lentement dans diverses circonstances.

Les deltas temporels sont souvent appliqués en physique car c'est ainsi que les équations sont spécifiées pour les intégrations Euler simples. L'intégration de la vitesse dans la position est définie comme x1 = x0 + v * (t1 - t0)ce qui simplifie en code comme x += v * dt. Par conséquent, des deltas temporels sont nécessaires pour évaluer les mises à jour de la physique.

Il est très, très normal que les deltas temporels soient mesurés et appliqués.

Sean Middleditch
la source
Je pense que c'est la meilleure réponse car elle explique que «dt» peut varier beaucoup, c'est pourquoi nous devons interpoler les calculs physiques avec.
BiAiB
Il peut être intéressant de noter qu'un problème majeur avec les deltas temporels dans certains contextes est que dans de nombreux cas, ils seront "désactivés" par une trame. Si quelque chose fait qu'une mise à jour de trame prend deux fois plus de temps que d'habitude, le delta appliqué lors du calcul des actions de cette trame sera celui habituel, même si la trame ne sera pas affichée avant le moment où les objets devraient être montrés déplacés deux fois plus loin comme ils l'ont fait. Si le temps entre cette image et la suivante est plus petit que d'habitude (peut se produire si le temporisateur essaie de "rattraper", les deux images avec moins de temps que d'habitude s'afficheront ...
supercat
... une distance plus grande que d'habitude entre les positions de l'objet).
supercat
@supercat: C'est juste le truc habituel Fix Your Timestep . Cependant, vous avez toujours besoin de deltas de temps par image pour savoir quand effectuer une simulation fixe.
Sean Middleditch
@SeanMiddleditch: En tant que personne qui a codé des jeux pour l'Atari 2600, je trouve curieux à certains égards que personne ne déplore le fait que sur les systèmes modernes, il y ait un décalage inévitable entre le moment où le joueur déplace un contrôleur et le moment où le personnage répond. Sur de nombreux jeux Atari 2600, le contrôle est interrogé toutes les 16,7 ms et les mises à jour des joueurs se produisent dans un délai de 1 à 16 ms (en fonction de la position verticale); les équipements modernes sont incapables de réagir aussi rapidement.
supercat
32

"Delta", "d" ou "Δ", signifie "différence" dans un contexte mathématique . Chaque fois qu'il existe une différence de différence entre deux nombres ayant des significations similaires, cette différence peut être appelée un "delta" ou un "d".

Les deltas sont très courants dans le développement de jeux. Par exemple, la différence entre la coordonnée X d'un caractère il y a une seconde et sa coordonnée X peut maintenant être appelée "delta x", et est généralement désignée par dx, delta_xou d_x.

De plus, il est très courant d'avoir la différence entre deux fois, comme vous l'avez dans votre code:

var delta = now - this.time;

Dans ce cas, cette variable indique la différence entre un certain temps stocké dans this.timeet le temps stocké dans now.

Les deltas sont couramment utilisés pour représenter le changement de quelque chose dans le temps. Ainsi, par exemple, si vous savez que les coordonnées X d'un joueur doivent changer 5 pixels à chaque image, vous pouvez stocker ce changement comme un delta:

var delta_x = 5

Et puis utilisez ce delta pour appliquer le changement chaque fois que vous en avez besoin:

player.x = player.x + delta_x

Mais rappelez-vous que ce n'est qu'une convention. Personne ne vous oblige à nommer vos variables "delta" ou "d", mais cela peut aider quelqu'un d'autre qui lit votre code, ou vous-même si vous le lirez à l'avenir, à comprendre ce que la variable est censée faire.

D'autres lettres grecques couramment utilisées dans la programmation sont:

Epsilon : pour une très petite valeur. Couramment utilisé lors de la comparaison de virgule flottante ou d'autres variables présentant des problèmes de précision:

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

Pi : pour la constante éponyme

Thêta : pour représenter les angles

Lambda : pour représenter des fonctions anonymes ou des fermetures

Pyjama Panda
la source
1
Vous verrez également certains multiples de π, comme 2π, π / 2, π / 4 et e (constante d'Euler).
jzx
@Thomas: Bien sûr, tout programme avec une base mathématique apportera la notation théorique dans le code. Notez la phrase « Autres communes lettres grecques largement utilisés dans la programmation sont ». " certains codes graphiques" ne peuvent guère être qualifiés de "courants" ou "largement utilisés". Je n'ai jamais prétendu que ce sont les seules lettres grecques qui peuvent être utilisées, ni que ce sont les seules significations que vous pouvez définir pour ces lettres grecques.
Panda Pyjama
@yzx: La dernière fois que j'ai vérifié, la constante d'Euler a utilisé la lettre latine "e". Je ne parlais pas des constantes mathématiques qui apparaissent dans le code, mais plutôt des lettres grecques couramment utilisées dans le code.
Panda Pyjama
@PandaPajama J'ai supprimé mon commentaire car il n'est pas le bienvenu.
Thomas
3
Si vos camarades sont particulièrement branchés, vous pourriez même voir Tau (τ) au lieu de 2π.
Kaz Dragon
3

dtreprésente delta time. Il est utilisé dans le calcul de la fréquence d'images pour garantir que le jeu fonctionne à la même vitesse, quelle que soit la fréquence d'images.

Plus d' informations sur framerate independencepeuvent être trouvés ici .

Réanimation
la source
3

dt (delta time) est le temps entre chaque cycle / image de rendu (ou tout horodatage que vous désirez) de votre boucle. Avec ce temps delta, nous pouvons étirer certaines valeurs dans le temps. Tout comme dans le monde réel, nous mesurons certaines propriétés physiques au fil du temps.

Disons que nous exécutons notre jeu 60 images par seconde. Si nous voulons que notre lecteur bouge de 5 pixels par seconde, nous le faisons

 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

ou

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

Le personnage se déplace de 5 pixels sur 60 images. Plus votre cycle prend de temps, plus le delta sera long.

Pour chaque framerate (1/30, 1/25, etc.), le résultat sera le même.

Sidar
la source