Avatar de l’utilisateur
par purpleunicorn
#26839 Il s'agit blog post. Pour lire le message original, s'il vous plaît cliquez ici »

Le Delta-time, ou dt, est une notion importante de Construct (et pas seulement), si vous ne l'utilisez pas, vous risquez une chose:

-que votre jeu ne tourne pas à la bonne vitesse en fonction du taux de rafraîchissement de l'écran, et des fps.

Ce mini-tutoriel à pour but de parler de cette valeur système, en essayant d'être le plus clair possible sur quand l'utiliser.
Delta-time, définition
Le delta-time, ou dt, est le temps écoulé entre la frame précédente et la frame actuelle, elle est actualisée à chaque frame, pour être plus clair, c'est le nombre de secondes par frame (c'est d'ailleurs son unité de mesure dans C2, pour rappel même si elle est en secondes par frame, cela ne signifie, heureusement pas, que elle est arrondie à la seconde par frame près, on est sur des valeurs minimales)

Ainsi, à un nombre de fps constant de 100, dt serait égal à 0,01 sec/frame, soit 1/100.

Le nombre de FPS dans C2 est, cependant, mis à jour uniquement à chaque seconde (il compte le nombre de frames rendues à chaque seconde), et donc la valeur fps ne doit pas être utilisée à la place!
Notion d'indépendance aux fps
Une notion courante, mais un peu erronée, est celle de l'indépendance au framerate, certains vont promettre que votre jeu sera totalement indépendant du nombre de fps si vous utilisez dt correctement, c'est faux, un nombre de fps élevé apportera une meilleure précision pour les mouvements, collisions, et behaviors, et ce pour une raison simple:

Un objet dans C2 ne se déplace pas, il se téléporte d'intervalles plus ou moins grands, et donc, si on ne prend pas les précautions nécessaires en plus, un objet se déplaçant très rapidement (d'une distance plus grande que sa bounding box en une frame par exemple) pourra potentiellement traverser un objet extrêmement fin si on ne vérifie que les collision avant et après téléportation.

Il faudrait plutôt parler de dépendance au temps, car le jeu aura les mêmes vitesses moyennes et ce, peu importe les fps, pour un temps donné (qui lui peut-être altéré avec le timescale mais c'est un autre débat), si votre jeu tourne sur un écran 120Hz,60Hz, ou que la synchronisation verticale est désactivée, la vitesse moyenne du jeu restera inchangée (dans les limites du raisonnable, il est possible de forcer C2 à ralentir dans le cas ou le nombre de fps serait trop bas).
Quand ne pas utiliser dt?
Avant de dire quand utiliser dt, autant prendre le temps de dire quand ne pas l'utiliser: si vous utilisez un behavior officiel (et sûrement aussi pour les behaviors faits par des tiers) autre que la physique (et même dans ce cas, une action permet de pallier à cela), dt est déjà utilisé en interne, vous n'avez généralement pas besoin de l'utiliser, car toutes les unités de vitesses sont en pixels par secondes (et non pas pixels par ticks) et les accélérations en pixels par secondes par secondes (et non pas en pixels par ticks²), ils sont donc déjà dépendant du temps plus que des fps.

Aussi, si vous utilisez une condition du genre every X seconds pour déplacer un objet, pour peu que X ne soit pas trop petit, là aussi vous exécutez 1/X fois par secondes le déplacement, qui est donc dépendant du temps écoulé.
Quand utiliser dt?
Lorsque vos interactions personnelles dépendent des fps plutôt que du temps, dt est un moyen de corriger le tir et de convertir une variation en unité/tick en unité/secondes. Un exemple:

Image

Ici, le sprite va bouger de 20 pixels chaque frame, peu importe si la frame dure 1/60 de secondes, 1/120 de seconde, 1/10 de seconde, donc, le mouvement dépend totalement du nombre de fps et non du temps!Image

Dans ce second exemple, on à multiplié la distance parcourue "speed" par dt, ce qui nous fait dans le cas d'un dt de 1/60 une valeur de speed/60 (c'est à dire 0.33333...) et pour un dt de 1/120, une valeur deux fois plus faible, la vitesse moyenne par seconde est donc égale à "speed".
Conclusion
Il est important de savoir en quelles unités vous parlez, un tick ça varie d'un matériel à un autre, voir même sur le même matériel, une seconde, c'est connu et fixe, il est donc important dans la plupart des jeux de parler clairement.

J'espère que ce mini tutoriel vous aura été utile pour mieux comprendre l'importance de dt, et je vous dis à bientôt.
Avatar de l’utilisateur
par Palourde
#26907 Des explications plutôt bienvenues pour moi. Malgré la lecture du manuel et d'autres éléments à propos du "dt", je n'ai jamais trop réussi à savoir dans quel cas il était nécessaire de l'utiliser ou non, c'est plus clair à présent, merci !

Tu abordes à un moment la notion suivante : " si vous utilisez une condition du genre every X seconds pour déplacer un objet, pour peu que X ne soit pas trop petit".

Je constate en effet que lorsque X est très faible, C2 ne respecte plus la notion de temps souhaitée. Par exemple, si je dis "Every 0.01 sec => add 0.01 to Variable.X", alors je m'attends à ce que ma variable X augmente de 1 chaque fois qu'une seconde passe (logique), or ce n'est pas le cas : la variable X augmente bien, mais plus lentement que ce qui est attendu.

Sais-tu à quoi est du ce problème ? j'utilise très souvent cette condition dans mon projet actuel et c'est assez gênant.
Avatar de l’utilisateur
par purpleunicorn
#26909 every 0.01 seconds se déroulera toutes les 0.01 secondes, sauf dans le cas ou ce 0.01 secondes devient inférieur à dt

pour rappel dt vaut normalement 0.01666666666 à 60 fps.

de plus, c'est une approximation, qui se vérifie à chaque frame, pas un trigger qui s'exécute sur un timer précis il me semble, et donc plus cette valeur sera petite, plus des aberrations vont s'accumuler.

un test à faire serait de comparer deux variable, une qui augmente de 0.01 chaque seconde, l'autre qui augmente de dt à chaque tick, et voir si les résultats finissent par diverger.

perso, je recommande de ne pas utiliser cette condition sauf pour des temps > ou égaux à 1 seconde (genre pour des infos de debug ou qui n'influencent pas le gameplay)

pour avoir un temps, on peut aussi voir du côté de la variable time.

Une dernière info qui est pas dans le tuto mais qui peut être utile, chaque sprite à une variable dt spécifique, ce qui peut être pratique pour gérer des timescale différents pour les objets dans le cas d'un objet que l'on contrôle manuellement.