1740

Folco (./1739) :
C'est risqué de baser la synchronisation d'un jeu sur un framerate ?

Oui tongue
SDL_gfx permet de fixer un fps constant (30 par défaut), ça ne devrait donc pas poser de problème ?
Tu veux dire *limiter* le FPS, et pas fixer un FPS constant (PS: 60 FPS c'est toujours mieux que 30 ^^). Si la machine n'est capable que d'afficher 15 FPS, ça va plus bien marcher. En fait le mieux c'est de ne pas limiter le FPS, comme ça les graphismes sont mis à jour plus rapidement sur les machines qui en sont capables (Faut évidemment que ton jeu supporte d'afficher des graphismes fluides à 60 fps, car si tes sprites bougent à 30, l'intérêt est en effet limité)
Je veux juste éviter le phénomène de certains jeux oldies qui tournent à des vitesses hallucinantes parce que la synchro ne marche plus grin
Parce que ces jeux ne mesuraient pas le temps écoulé, ou bien ajustaient leur timings d'une manière kikoololesque. (Avec des boucles for vides par exemple trioui)

La meilleure façon de synchroniser pour que ça tourne partout de manière indépendante du matériel graphique (bon si le CPU est trop lent par contre, on n'y fera rien ^^) c'est d'utiliser des intervalles de temps fixes pour tes mises à jour. (Les intervalles de temps variable sont *hyper* sensibles au matériel, et ne pas utiliser d'intervalle de temps, n'en parlons même pas grin)
Je reprends le code d'un ancien post:
/* 120 Hz */
#define f 120d
/* f = 1 / T <=> t = 1 / f */
#define T (1d / f)

float Update(float delta);
void Render();

int main()
{
	long oldTime, newTime;
	double xTime = 0; /* Parce que sur x86 les float ça sert a rien :p */

	Initialiser();

	oldTime = GetTickCount(); /* Je prend un timer de référence (en millisecondes) */

	while true
	{
		newTime = GetTickCount();

		xTime = Update(xTime + (newTime - oldTime) / 1000d);

		Render();
		
		oldTime = newTime();
	}
}

double Update(double delta)
{
	while (delta > T)
	{
		delta -= T;
		
		/* Faire les calculs sur une durée écoulée T */
		
	}

	/* Il reste du temps non utilisé, on s'en servira la fois prochaine */
	return delta;
}

void Render()
{
	/* Dessiner ce qu'il faut ici */
}
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1741

À noter que le reste du topic pointé par GC peut mériter d'être lu, puisqu'il ne s'agit pas de la seule méthode disponible (et pas non plus de celle que je choisirais si je devais faire un jeu).

Après, c'est pour ton projet de jeu cross-platform PC/Ti ? Si oui, tu vas avoir de sacré contraintes matérielles à prendre en considération, et peut-être que la solution du ./1740 deviendra l'une des meilleures alternatives, puisque relativement peu gourmande en calculs smile
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

1742

iwannabeamaki (./1741) :
À noter que le reste du topic pointé par GC peut mériter d'être lu

Ca marche. Et merci Golden de l'avoir dépoussiéré grin
iwannabeamaki (./1741) :
Après, c'est pour ton projet de jeu cross-platform PC/Ti ?

C'est exactement ça, sauf qu'en fait il ne sera pas du tout cross-plateforme vers TI cheeky
Me fait trop chier de faire un programme comme ça dans un langage non-objet en fait. Comme je disais hier à Zerosquare, je me suis corrompu l'esprit une fois avec l'objet, maintenant j'y reviens pour ce genre de programme, voilà c'est de votre faute de m'avoir aidé cheeky


En fait voilà la doc : http://www.ferzkopp.net/Software/SDL_gfx-2.0/Docs/html/_s_d_l__framerate_8h.html
Je ne vois pas ce qui pourrait un jour casser. Mais peut-être est-ce juste crade dans le principe.

1743

Je vous ferais un graphique très clair (pourquoi ne l'ais-je encore jamais fait… ?) de pourquoi il ne faut jamais* choisir autre chose que la méthode du fixed timestep. tongue
En attendant Folco, je sais pas trop ce que vaut ce "limiteur de framerate" de SDL. Ça me semble assez flou d'après la documentation que tu as donnée. Y'a pas assez de détails techniques dedans sad
Si c'est vraiment *juste* un limitateur de framerate (ralentit la fréquence du dessin à l'écran) c'est vraiment très crade (même si ça devrait offrir certains avantages du fixed timestep), mais si c'est un équivalent du fixed timestep, c'est sans doute correct. (Je sais pas non plus à quoi ressemble la boucle de rendu de SDL donc je ne m'avancerai pas trop)

* Jamais ça veut dire que les cas ou tu as strictement besoin de choisir un intervalle variable sont très spécifiques, et que tu devrais t'en rendre compte si ça t'arrive.
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1744

Sans aller jusqu'au schéma, tu peux expliquer en 3 mots pourquoi tu considère que la méthode basée sur des itérations fixes est la meilleure (voire la seule) valable ?

(parceque j'aurais tendance à avoir l'avis opposé, à savoir que les intervalles de temps variables donnent les meilleurs résultats même si les calculs sont plus complexes, donc je suis curieux ^^)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

1745

il s'exprime mal, c'est pas fixed timestep sinon le jeu rame selon la vitesse cpu.

il veut dire "en temps réel" je pense, en travaillant avec des millisecondes au lieu de frames, du coup en timestep variable.

mais gaffe dès que le timestep devient trop grand, on peut faire diverger les intégrales du mouvement.

1746

Le code est là : http://www.ferzkopp.net/Software/SDL_gfx-2.0/Docs/html/_s_d_l__framerate_8c_source.html

Comme l'explique un schéma, ça fait juste une boucle d'attente en attendant que la synchro suivante arrive. Et c'est "lissé", si une frame est arrivé 5ms trop tard lors d'un cycle, la suivante essaira d'arriver 5ms plus tôt. T'es toujours sûr d'avoir 500 images en 10 secondes si t'es à 20 fps par exemple, donc je trouve ça pas mal.

1747

squalyl (./1745) :
il veut dire "en temps réel" je pense, en travaillant avec des millisecondes au lieu de frames, du coup en timestep variable.

Non justement, regarde le topic qu'il a proposé en lien, le post sur lequel tu vas tomber explique précisément ce qu'il entend pas "fixed timestep".
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

1748

squalyl (./1745) :
il s'exprime mal, c'est pas fixed timestep sinon le jeu rame selon la vitesse cpu.
Absolument pas, c'est bien du fixed timestep qu'il faut. Et ça ne fait pas ramer le jeu "selon la vitesse du CPU" trifus
mais gaffe dès que le timestep devient trop grand, on peut faire diverger les intégrales du mouvement.
Tout à fait. C'est une des raisons pour laquelle le variable timestep c'est mal.
Mais comme le dit monsieur le maki-to-be, si tu fais très bien tes calculs (en fait dans un jeu c'est impossible à cause des entrées utilisateur), alors ça ne devrait pas non plus arriver smile
Sauf que de tels calculs sont extrêmement couteux, et peu rentables par rapport à une bête approximation type Euler avec un pas fixe smile

Donc voilà le graphique: reIx
C'est une fonction assez simple, et voilà ce que ça donne en 100 itérations. (Mais la courbe est tracée par rapport au temps vu que c'est ce qui nous intéresse)
En gros, la courbe bleue est totalement indépendante du temps. (Fonction réelle)
La courbe rouge est une approximation de Euler à intervalle fixe. (La méthode du fixed timestep)
La courbe verte est une approximation de Euler avec un intervalle « en moyenne » constant. (La méthode du variable timestep dans le cas standard et plus ou moins optimal)
La courbe violette est toujours la même approximation de Euler, dans le cas où l'intervalle précédent subit des variations plus ou moins imprévisibles. (La méthode du variable timestep sur un PC moins bon ou un peu chargé)

La courbe bleue: Si tu arrives à implémenter ça dans tous les cas (même quand tu as plus qu'une simple gravité) avec un timestep variable, le résultat sera assez bon, et relativement indépendant de la machine. Mais à chaque image, les calculs doivent être refaits à partir de t=0 afin de ne pas accumuler d'erreurs non prévisibles.
La courbe rouge: Quelle que soit la machine et la configuration, les résultats seront constants. Pas totalement corrects numériquement, mais malgré tout très proche (il faut quand même prendre un intervalle assez petit. Au moins 1/60 pour PC.)
La courbe verte: Les écarts ici ne sont pas suffisamment grands pour trop influencer la courbe. Les petites approximations (erreur plus faible) viennent compenser les plus grosses approximations (erreur plus élevée).
La courbe violette: Ce qui se passe quand ça marche moins bien qu'avec la courbe verte.

En fait le fixed timestep est totalement prévisible. (Et l'erreur aussi est prévisible du coup)
Cela te permet d'utiliser des approximations de manière fiable.
Ça va donner *exactement* les mêmes résultats (numériques) sur toutes les machines.
Ça peut te permettre de faire des évènements scriptés qui vont jouer exactement pareil partout. (Tu peux donc aussi facilement faire des replay… PS: imagines toi rejouer un replay enregistré à 45FPS en moyenne sur une machine à 57FPS en moyenne)
Ça peut aider à la synchronisation pour le jeu en réseau. (Enfin là c'est une science complexe, donc bon…)
Si tu conçois bien ton jeu, il est impossible que tu rates une collision avec un fixed timestep. (Y'a des vitesses maximales à respecter, totalement dépendantes de l'intervalle que tu auras choisi… C'est mathématique ! oui)

En fait, les intervalles variables sont très bien uniquement si tu peux garantir que l'exécution de la trame n ne dépend en aucun cas de l'exécution des trames précédentes. Dans ce cas là ils n'ont aucun défaut et que des avantages.
Les approximations type Euler se basent toujours sur des résultats (approximations) intermédiaires calculé à la trame précédente… Ce qui est un énorme défaut avec les intervalles variables. oui

(Bon, c'est plus complexe, mais il y a aussi la possibilité de faire des modèles hybrides. Par exemple quand tu fais tourner ton moteur physique à 30 FPS, et que ton écran rafraîchit entre 60 et 85 FPS… En général tu aimerais bien que le jeu en profite.)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1749

Maintenant regardons avec un autre point de vue.

J'implémente un jeu en fixed timestep, et je choisis un intervalle de temps de 20ms. Me voilà avec un jeu limité à 50fps, puisque même si ma machine est capable d'en calculer plus elle ne va pas me les afficher (au mieux, si mes calculs et mon rendu sont indépendants, elle va m'afficher quelques frames en plus mais comme l'actualisation de la scène n'aura pas été effectuée depuis la dernière frame, je vais afficher deux fois exactement la même scène au pixel près). Limiter les fps à 50 dans un jeu actuel, c'est quand même sacrément dommage. Personnellement je sens une différence assez flagrante dans les jeux "rapides" (Quake 3 ou des FPS plus modernes par exemple) entre 50 et 60fps, donc heureusement qu'ils n'utilisent pas cette technique qui bornerait le framerate et pénaliserait donc le gameplay.

Mais ce n'est pas le pire. Supposons maintenant que je considère que 50fps c'est trop peu (et cette considération est tout à fait légitime), donc je choisis un intervalle de temps de 5ms. Me voilà avec un maximum de 200fps, c'est toujours limité mais c'est quand même vachement mieux. Manque de bol, je joue sur une machine un peu limitée qui ne peut m'en afficher que 20. Du coup à chaque cycle, il s'est écoulé 10 fois l'intervalle "unitaire" que j'avais choisi, ce qui veut dire que toute ma phase d'actualisation des objets est effectuée... 10 fois. Dans un jeu un peu sérieux, recalculer 10 fois de suite toute ma scène est loin d'être une opération négligeable, j'aurais même tendance à dire que c'est même complètement délirant. Je suis donc en train de plomber complètement mes performances alors que justement je suis déjà sur une machine qui avait du mal à faire tourner mon jeu.

En ce qui concerne l'histoire de précision, il faut aussi noter quelque chose d'important. Premièrement, à moins de faire n'importe quoi avec les calculs, je vais rester beaucoup plus près de la courbe verte de GC que de la courbe violette. C'est sûr, les calculs ne peuvent pas être prédis à la 8ième décimale près, mais la marge d'erreur restera quand même négligeable. De toutes façons, quelle que soit la méthode choisie, il était bien évidemment hors de question de faire des tests stricts sur ce qui se passe dans mon jeu. Le fixed timestep me permet de retrouver exactement les mêmes résultats de calculs, mais qui va s'amuser à tester, je ne sais pas, par exemple que la position d'un objet est égale à une constante ? Ce serait aussi foireux que de comparer des floats avec "==", et jamais je ne vais vouloir faire ça. Je ne testerai pas mes collisions en comparant la position de objet1 avec celle de objet2, pas plus que je n'effectuerai de test d'égalité stricte avec n'importe quelle variable dont la valeur va évoluer de façon continue au cours de mon application. Même si j'arrivais à m'en sortir comme ça, mon jeu serait définitivement condamné à tourner avec le même intervalle de temps, puisque mes calculs ne seraient plus prédictibles si j'en changeais.

Bref, je ne pense pas qu'il soit utile de faire un dessin ^^
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

1750

Mais heu, ton graph GC a pars ça il indique quoi ? quelle sont les unité? quelle est la fonction F(x) ? non parceque bon la c'est n'importe quoi, moi aussi je peux tracer des cloches d'euler et leur faire prédire l'avenir !
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

1751

Quelle unité ? C'est une parabole, ça se voit non ?
Elle commence à 0 finit à 1… Et en 100 étapes, je te laisse deviner le reste. (C'est quand même bien visible, non ? -_-)
a = -10
v = 5
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1752

C'est quand même n'importe quoi ta courbe très aléatoire.
Si tu as un FPS qui varie autant, tu as des problèmes bien plus grave à régler que de choisir entre une fréquence de mise a jour constante ou variable...
avatar

1753

Ben heu non, imagine que ton jeu tourne en même temps qu'un scan antivirus ou que l'installation des mises à jour de Windows…
C'est très loin d'être irréaliste. (PS: au fait, la courbe violette dépasse vers le bas avec les 100 itérations mais ce qui compte c'est le moment où elle touche l'axe horizontal hein…)
J'ai pris une base un FPS moyen (Comme la courbe verte: un delta entre 0 et 2 fois celui de la courbe rouge) ou 1/4 des trames mettent 4 fois plus de temps à s'exécuter… (Juste histoire de pas sortir la courbe où l'intervalle est deux fois plus long qui s'éloignera aussi pas mal des autres mais sera beaucoup moins réaliste)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1754

Et ben ton jeu sera injouable que ça soit en intervalle fixe ou en intervalle variable. 1/4 des trames qui sont 4 fois plus longues ce ne sont pas du tout des conditions normales.
Si en intervalle variable tes frames mettent 4 fois plus de temps que la l'incrément en intervalle fixe, et ben en intervalle fixe ta frame mettra aussi 4 fois plus de temps et ta simulation n'aura avancé que d'un temps constant : tu auras aussi un résultat complètement saccadé et ralenti. C'est pas beaucoup mieux.
avatar

1755

Non, mais en fait j'ai l'impression que personne n'a compris comment ça marche là. (Vous avez lu le code que j'ai posté tout à l'heure ?)
Si ma trame de temps fixe fait 4T, et que mon intervalle variable fait 17T, alors j'exécute pas juste un cycle fixe de 4T. J'exécute 4 fois un cycle fixe de 4T (plus un autre si le reste était déjà de 3T) et il reste 1T pour la prochaine fois (ou 0 si utilisé cette fois là)…
Non mais franchement -_-
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1756

j'avais pas lu ton code en effet, mais je maintiens toujours ./1752
avatar

1757

Ben d'une part un jeu qui tourne a 60 FPS peut encore être suffisamment jouable à 15 FPS (à cause des ralentissements).
Et d'autre part, le but est de permettre à ton jeu de retrouver un état normal après 1 minute à avoir tourné "au ralenti". C'est la seule méthode qui permette d'obtenir un résultat stable.
D'ailleurs si tu joues en réseau, tu ne pourrais pas te permettre que tous les acteurs jouent à des vitesses effectives différentes. Si deux voitures identiques commencent à 0, elles doivent toutes les deux finir à x après un temps t à avoir roulé tout droit. C'est ça qui compte tongue
(Ah et désolé Zephyr j'ai pas encore répondu à ton post en fait, je le ferai un peu plus tard tongue)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1758

on est tout à fait d'accord que cette méthode a plein de bénéfices smile

sinon, un jeu peut être jouable à 15fps stables. c'est pas du tout le cas sur ton graphe.
Et pour un jeu en réseau tu penses bien que les états sont synchronisés très très régulièrement avec l'état du serveur. Et généralement ce n'est pas l'état calculé par le client qui est distribué à tout monde mais uniquement les états calculés par le serveur. Il y a beaucoup de jeux en réseau pour montrer que ça fonctionne. tongue
Ceci dit, c'est très probable qu'un serveur dédié fonctionne en intervalle fixe et les clients en intervalle variable.
avatar

1759

GoldenCrystal (./1757) :
(Ah et désolé Zephyr j'ai pas encore répondu à ton post en fait, je le ferai un peu plus tard tongue)

Te sens pas obligé de te presser hein, j'aime pas spécialement écrire des tartines grin

(mais sinon malgré ./1755 il me semble quand même avoir compris ton code, l'un des défauts que je cite est précisément lié à la quadruple exécution que tu évoques ^^)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

1760

gc> et, heu, utiliser un integrateur moins merdique et naif qu'un forward euler, c'est pas faisable? trifus

a la limite, je veux bien admettre que ca soit pas forcement trivial d'ecrire un code closed-form pour un mouvement avec une friction qui depend de la vitesse au carre, mais serieux, pour une equation de mouvement aussi bidon qu'une vitesse + gravite, il est ou le probleme?
aaach sheisse ca diverge si on ecrit:
vel = vel + accel * dt;
pos = pos + vel * dt;

omgomgomgomg !!!1
non sans blague... smile

EDIT: au fait, le fixed timestep, c'est tres bien pour deux trucs:

- soit t'es un bras casse qui a pas envie de se faire chier (a ne pas prendre comme une attaque personnelle © hein)
- soit t'as des problematiques un poil plus complexes, genre detecter des collisions rotatives entre des objets ayant une vitesse angulaire importante sans excessivement te prendre la tete et exploser ton budget perfs, et autres joyeusetes...
avatar
HURRRR !

1761

btw, en parlant de "un integrateur moins merdique et naif qu'un forward euler", je parle pas d'un runge-kutta 2 ou 4, ou d'un verlet, ni meme d'un implicit euler hein. juste de l'integration bete et mechante des equations de mouvements... un truc niveau lycee quoi.

apres, il est bien evident que si tout d'un coup ton antivirus lance un scan general du systeme et freeze toutes les autres applis pendant trois minutes, que tu te retrouve avec un dt de 180 secondes, et que t'as des forces qui changent plusieurs fois par seconde, tu risque d'avoir une legere divergence par rapport au "vrai" resultat trioui
mais le variable timestep n'est pas mal en soit ! en tout cas c'est ce que je pense... evidemment il vaut mieux gerer certains cas stupides extremes.. comme l'exemple au dessus... j'ai vu certaines applis faire simplement un dt = max(dt, 0.1), et meme if (dt < dtTreshold) ResyncWholeStateFromServer()..
avatar
HURRRR !

1762

iwannabeamaki (./1749) :
Maintenant regardons avec un autre point de vue.
J'implémente un jeu en fixed timestep, et je choisis un intervalle de temps de 20ms. Me voilà avec un jeu limité à 50fps, puisque même si ma machine est capable d'en calculer plus elle ne va pas me les afficher […]
Non mais pourquoi tu irais choisir un FPS aussi bas ?
Evidemment, le moteur physique doit tourner à une fréquence supérieure ou égale à la fréquence de rafraîchissement de l'écran. De nos jours y'a quasiment plus aucun PC qui ne rafraichisse plus vite que 60Hz, et le maximum était de 120Hz… Si tu choisis 120Hz pour le moteur physique, tu es certain que tu auras toujours au moins 1 cycle de physique exécuté par image affichée à l'écran (enfin, jusqu'à ce qu'on invente le cerveau bionique dont les délais synaptiques sont quasi nuls, et qui nous permettront de jouer avec des écrans à 500 Hz trioui)
Mais ce n'est pas le pire. Supposons maintenant que je considère que 50fps c'est trop peu (et cette considération est tout à fait légitime), donc je choisis un intervalle de temps de 5ms.[…]
Faut bien choisir ton intervalle évidemment cheeky
Je suggère 120Hz mais ça peut en effet être un peu couteux selon ce que tu dois simuler.
En fait tu dois choisir la fréquence en fonction du type de jeu (si c'est un jeu rapide, la fréquence doit être plus élevée (≥ 120Hz), mais si c'est un jeu lent , tu peux viser moins (60Hz))
Dans un jeu un peu sérieux, recalculer 10 fois de suite toute ma scène est loin d'être une opération négligeable, j'aurais même tendance à dire que c'est même complètement délirant.
Si tu fais un trop long saut, tu risques de traverser des objets sans collisions pas vrai ?
Donc soit tu vas devoir faire des équations complexes pour évaluer les collisions.
Et là le plus simple c'est en fixed timestep, ou une collision de volume en mouvement est la même chose qu'une collision de volumes statiques. (si tu as bien choisi tes vitesses et ton intervalles de temps)
Au final la simplification des calculs fait que les 10 itérations peuvent être moins couteuses (et au plus aussi couteuses) qu'une seule itération variable.
En ce qui concerne l'histoire de précision, il faut aussi noter quelque chose d'important. Premièrement, à moins de faire n'importe quoi avec les calculs, je vais rester beaucoup plus près de la courbe verte de GC que de la courbe violette.
Tu ne peux pas le garantir avec un intervalle variable. Suppose que le rendu d'une trame soit délayé de 15T (T = durée normale d'une trame) parce que un programme de merde vient de swapper a mort sur ton PC, il se passe quoi dans ton moteur fixe ? Les conséquences, c'est que ton personnage va rater la corniche que tu visais en sautant (parce que la distance avait été ajustée précisément dans le jeu) et t'écraser au sol comme une merde.
Le fixed timestep me permet de retrouver exactement les mêmes résultats de calculs, mais qui va s'amuser à tester, je ne sais pas, par exemple que la position d'un objet est égale à une constante ?
Ce qui compte surtout (mais je me répète) c'est que la précision de tes calculs est garantie. On parle même pas d'exactitude. Car les calculs ne seront jamais exacts.
En fait pour l'exemple que j'ai donné (mais la fréquence est de 100Hz pour le coup, donc la précision est déjà très bonne en principe) tu verrais que les différences sont loin de la 8e décimale, et beaucoup plus proches de la 3e décimale après 1 seconde. (C'est assez difficile à quantifier car il faut que les intervalles soient de durée quasi identique à lé base)

En fait je me permet de te rapeller ce que j'ai écrit ici:
GoldenCrystal (./1748) :
il y a aussi la possibilité de faire des modèles hybrides. Par exemple quand tu fais tourner ton moteur physique à 30 FPS, et que ton écran rafraîchit entre 60 et 85 FPS… En général tu aimerais bien que le jeu en profite.
Je pense que ce n'est pas la peine de détailler (et en plus c'est bien loin des préoccupations de Folco à mon avis ^^) mais au pire ça peut s'arranger tongue
Bref, je ne pense pas qu'il soit utile de faire un dessin ^^
Siiii ! (En fait non tongue)

aze > Heu ouais, surtout si ton serveur n'a pas de rendu graphique cheeky
Mais même si il en avait un en fait peu importe la méthode de synchronisation qu'il utilise. Le truc c'est juste que c'est difficile de synchroniser des clients dont les référentiels de temps sont totalement différents non constants, et aléatoires. cheeky
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1763

Bon, je réponds demain parceque j'ai pas le temps ce soir, mais rien qu'à lire ça :
Si tu fais un trop long saut, tu risques de traverser des objets sans collisions pas vrai ?

tu n'as manifestement jamais codé de jeu grin (si tu testes juste qu'à un instant T les objets sont en collision, tu risques effectivement d'en rater pas mal, framerate contrôlé ou pas)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

1764

iwannabear (./1760) :
gc> et, heu, utiliser un integrateur moins merdique et naif qu'un forward euler, c'est pas faisable? trifus
Hmm… heu… C'est ce que j'ai appelé « calculs bien faits » dans mes posts grin Mais c'est quand même beaucoup plus chiant.
a la limite, je veux bien admettre que ca soit pas forcement trivial d'ecrire un code closed-form pour un mouvement avec une friction qui depend de la vitesse au carre, mais serieux, pour une equation de mouvement aussi bidon qu'une vitesse + gravite, il est ou le problème ?
Heu y'a pas de problème vu que l'équation elle est également utilisée dans mon graphique (la courbe bleue). smile
(Et t'en fais pas je pense que je m'en sortirais à gérer juste des paraboles… grin)
aaach sheisse ca diverge si on ecrit:
vel = vel + accel * dt;
pos = pos + vel * dt;

omgomgomgomg !!!1
non sans blague... smile
Ben voyons, pourquoi tu crois que j'ai choisi cet exemple ? cheeky
C'est parce que c'est simple et que ça expose bien ce que je voulais dire.
- soit t'es un bras casse qui a pas envie de se faire chier (a ne pas prendre comme une attaque personnelle © hein)
Ah mais je déteste me faire chier oui

(Bon allez je vais arrêter le HS après ce post grin)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1765

./1763 > heu si, mais je déteste les collisions. J'aime bien les trucs simples comme les intersection de bounding box et de bounding rectangle. wink
(Rha bordel je voulais éditer mon post et à la place j'ai cité T_T)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1766

en fait c'est comique cette discussion, applique a des mouvements ou il existe des solutions closed-form dont le cout est ridicule, du genre "Les conséquences, c'est que ton personnage va rater la corniche que tu visais en sautant (parce que la distance avait été ajustée précisément dans le jeu)"
En fait pour l'exemple que j'ai donné (mais la fréquence est de 100Hz pour le coup, donc la précision est déjà très bonne en principe) tu verrais que les différences sont loin de la 8e décimale, et beaucoup plus proches de la 3e décimale après 1 seconde. (C'est assez difficile à quantifier car il faut que les intervalles soient de durée quasi identique à lé base)

laught
tu te rends quand meme compte que l'accumulation des imprecisions sera bien plus grande en faisant plein de petits timesteps qu'en en faisant un seul grand, non? (pour un integrateur closed-form j'entend hein, pas pour un truc biaise qui a l'air vaguement de donner des resultats credibles, comme ce qui a eu l'air d'etre utilise pour le graphique que t'as poste)
Non mais pourquoi tu irais choisir un FPS aussi bas ?
Evidemment, le moteur physique doit tourner à une fréquence supérieure ou égale à la fréquence de rafraîchissement de l'écran. De nos jours y'a quasiment plus aucun PC qui ne rafraichisse plus vite que 60Hz, et le maximum était de 120Hz… Si tu choisis 120Hz pour le moteur physique, tu es certain que tu auras toujours au moins 1 cycle de physique exécuté par image affichée à l'écran (enfin, jusqu'à ce qu'on invente le cerveau bionique dont les délais synaptiques sont quasi nuls, et qui nous permettront de jouer avec des écrans à 500 Hz trioui)


aaaah ce bon vieux Myth qui ressort de derriere les fagots.. #itm#
alors, pour reprendre l'exemple de bob... Q3. non, ce n'est pas du bullshit lorsque les joueurs te disent qu'ils sentent la difference entre 60 et 120 fps. (sauf si le sv_fps est set a 60, ca va de soit cheeky)
tu vois le probleme du mauvais cote. ce n'est pas le refresh rate qu'il faut regarder, mais la resolution du timing des events.
strictement parlant, pour l'affichage, lorsque tu fais des rendus en vsynch a 60 Hz, c'est bien evident que ca sert a rien d'updater a plus de 60Hz.
MAIS ! ne rien voir d'autre, c'est ne pas voir plus loin que le bout de son nez... certains trucs necessitent un timing beaucoup plus precis que ca. quand tu veux intercepter un adversaire en mid-air avec un coup de railgun, ou en l'anticipant avec une roquette, ou que tu veux bien timer un rocket-jump (ca se joue a la frame de decalage, en tournant a 120 fps), ce n'est plus la frequence d'update qui compte, mais l'instant precis ou t'appuie sur ta touche, et ou l'evenement a lieu (tir, saut, etc..) si il a lieu au debut d'un intervalle de 60 Hz entre deux frames, alors que t'avais appuye sur la touche a 40% de l'intervalle entre les deux precedentes frames, crois moi, entre 60 et 120 fps, tu sens la difference.

bref.
</rant>

avatar
HURRRR !

1767

Ben voyons, pourquoi tu crois que j'ai choisi cet exemple ? C'est parce que c'est simple et que ça expose bien ce que je voulais dire.

ok, donc tu choisis volontairement un integrateur pourri pour essayer de demontrer un "n'utilisez pas de variable timestep, c'est mal!" ... trifus
a la limite, "n'utilisez pas d'explicit euler, c'est mal!", la ok tongue
avatar
HURRRR !

1768

Non en fait par « cet exemple » je parlais de la parabole ^^
Au début je voulais faire un truc plus complexe genre avec un mec qui appuie sur un bouton à t = 0.5 précisément en plus… Mais finalement non.
Et j'ai mis le Euler parce que c'est ce que moi j'utilise (oui je n'aime pas me faire chier) et que ça marche très bien en fixed timestep (l'erreur est très faible). Et je pense que c'est ce que beaucoup de monde aurait tendance à utiliser.

Et ne t'en fais pas… C'est pas au « mythe » de la persistance rétinienne que je faisais allusion, mais bien au délai synaptique qui fait qu'en fin de compte on a une limitation physique de vitesse de réaction. (Tu peux pas imaginer comme j'ai été triste quand on m'a appris ça en cours de SVT au lycée…) Mais c'était surtout pour dire qu'il y a peu de chance qu'un jour il soit strictement nécessaire d'afficher plus de 120 images par seconde (sauf pour les écrans 3D etc etc mais c'est de la merde et moi ça me sert à rien tongue)

Sinon j'ai aussi été traumatisé par les jeux avec une synchro merdique, comme par exemple WoW où tu sautes dans un lac et ton PC freeze, et du coup tu te retrouves mort au fond du lac* triso (En fait ça pourrait aussi venir du chargement progressif des données, mais maintenant que j'y réfléchis y'a d'autres cas où le chargement n'entre pas en compte (l'eau est déjà chargée) et un comportement similaire se produit… De toutes façons ce jeu est bourré de bugs…)

* Précisons que dans la physique du jeu (si j'interprète bien ce qui est visible) le personnage stoppe totalement sa chute dès qu'il atteint la surface de l'eau. (Sauf que leur implémentation de ça suxe totalement)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1769

Et ne t'en fais pas… C'est pas au « mythe » de la persistance rétinienne que je faisais allusion, mais bien au délai synaptique qui fait qu'en fin de compte on a une limitation physique de vitesse de réaction. (Tu peux pas imaginer comme j'ai été triste quand on m'a appris ça en cours de SVT au lycée…) Mais c'était surtout pour dire qu'il y a peu de chance qu'un jour il soit strictement nécessaire d'afficher plus de 120 images par seconde (sauf pour les écrans 3D etc etc mais c'est de la merde et moi ça me sert à rien tongue )

non mais justement c'est pas de temps de reaction que je parle, pas dans le sens "tu reagis a un stimuli", mais de timing. tu peux tres bien mettre 0.1 secondes a reagir a un stimuli, mais c'est pas pour autant que t'aura une granularite de 0.1 secondes pour declencher un evenement 0.85 secondes precisement apres le dit stimuli. tu vois ce que je veux dire? ou declencher deux evenements tres proches l'un de l'autre (genre cliquer sur le bouton droit et gauche quasi-simultanement, a un intervalle extremement proche, style 0.02 secondes) ce n'est pas une question de vitesse de reaction a un evenement externe. ie: ca n'a, je pense, pas grand chose a voir avec des stats de ce genre la : http://www.humanbenchmark.com/tests/reactiontime/stats.php

bon pour le coup de wow, je vois pas trop comment un fixed timestep changerait quoi que ce soit grin (et surtout, il y a tres fortement moyen que le serveur tourne deja en fixed timestep, a un framerate extremement bas, genre 20 fps) du point de vue du serveur, avec un lag reseau, ou un lag local de ton client, ton perso aura quand meme saute dans le lac, et n'aura rien envoye de special pour dire "je sors de la" pendant plus de temps qu'il ne lui en faut pour crever hum mais bon j'ai ptet pas bien compris ce que t'expliquais ?
avatar
HURRRR !

1770

iwannabear (./1769) :
non mais justement c'est pas de temps de reaction que je parle, pas dans le sens "tu reagis a un stimuli", mais de timing. tu peux tres bien mettre 0.1 secondes a reagir a un stimuli, mais c'est pas pour autant que t'aura une granularite de 0.1 secondes pour declencher un evenement 0.85 secondes precisement apres le dit stimuli. tu vois ce que je veux dire? ou declencher deux evenements tres proches l'un de l'autre (genre cliquer sur le bouton droit et gauche quasi-simultanement, a un intervalle extremement proche, style 0.02 secondes) ce n'est pas une question de vitesse de reaction a un evenement externe.
Ah ok, la vitesse d'enchaînement des actions ? Compris chef smile
http://www.humanbenchmark.com/tests/reactiontime/stats.php
trilove
(Quelle surprise, j'ai un temps de réaction de merde grin)
bon pour le coup de wow, je vois pas trop comment un fixed timestep changerait quoi que ce soit grin (et surtout, il y a tres fortement moyen que le serveur tourne deja en fixed timestep, a un framerate extremement bas, genre 20 fps) du point de vue du serveur
En fait le serveur n'a même rien à voir là dedans (énormément de trucs sont gérés côté client… le serveur ne vérifie même pas grand chose à ce que le client lui envoie…).
Disons que normalement, après avoir "téléporté" magiquement le personnage super bas par un calcul d'intervalle de temps très long, la moindre des choses serait de le remonter.
Si j'interprète bien ce que je vois, leur algorithme est à peu près "si joueur_py < niveau de l'eau alors joueur_vy = 0 et joueur_ay = 0" mais testé après le test de si le joueur est en dessous du décor. En fixed timestep tu ne peux jamais déplacer le joueur de plus de N unités, donc même cette implémentation simpliste ne peut jamais beaucoup t'éloigner de la surface de l'eau, contrairement à ce qui se passe en réalité sad
(Bon tu pourrais malgré tout quand même mourir dans les flaques d'eau mais ça je crois que c'est un peu normal grin)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes