vous etes mignons les gars…
maintenant pour une VRAIS explication
de tout temps, les jeux ont eu besoin d’etre synchronise sur quelque choses (car si on synchronise sur rien (genre logique/display/logique/display) ca ne va bien tourner que sur la machine ou ca a ete ecrit, et rien d’autres !!!
avant, sur PC, (a l’epoque du 486) : les jeux/demos etait synchronise a la frame!
bougez pas j’esplique : 99% des cartes videos tournaient, dans la plus part des modes video, a une vitesse STABLE : elles etait toutes entres 60 et 65Hz, et que, a l’epoque, les CMs n’avait pas de timer correct (en terme de precision ou de stabilite, et en plus il etait pas super pratique), donc ce qu’on faisait c’est qu’on attendait la frame :
logique
rendu
waitforframe < — > attent la fin de la prochaine frame
et apres le but etait code de manieres a tourner dans une frame sur la machine la plus basse (souvent 386 ou 486/33).
A part certain titres, qui eux avait eu le courage d’utilise la methode 2 (ci-apres )
sinon, plus vicieux, mais surtout utilise en demo, : on synchronisait sur la musique !
puis est venue, les pentioums, et les vrais CM et tout un tas d’autres truc :
- d’abords, avec les pentioums, on a vue de plus grandes differences de perfs entre les differents PC, et ca c’etait genant !
- puis est arrive le VESA, et des nouvelles cartes videos, avec plein de modes video bizarres et differents, et avec des frequences et des performances variables,
- et puis souvent des timers enfin utilisable !
- et puis aussi le marche du jeux pc devenait un vrais marches, pas trois gugusse (avec des GUS (demo joke inside) ) !
donc ce qu’on a decide de faire, c’est de synchronise au timer, plutot qu’a la frame :
startTime = EndTime = 0
[…]
[…]
startTime = GetTime
DeltaTime = endTime - startTime
logique(DeltaTime);
rendu
EndTime = GetTime
waitforframe < — c’est plus vraiment necessaire mais c’est souvent plus propre ! >
ou autre model du meme genre ! (y a d’autre moyen de faire, sisi j’insiste !)
dans ce modele la, toute la logique est fait pour etre calcule en fonction du temps ecoule, et plus en fonction d’un pas precis :
avant :
voiture.position = voiture.position + voiture.vitesse;
avec le timer
voiture.position = voiture.position + voiture.vitesseparseconde * DeltaTime;
petit problem : ca rajoute une multiplication dans le calcul, donc ca demande plus de calcul, c’est pour ca que bien souvent, sur console, on persiste a utilise la frame pour faire la synchronisation, parce que c’est stable et que c’est moins cher !
et la, soudain, la lumiere vous frappes : “Mais, Mais, Mais sur consoles, c’est pas stable, ca peut etre 50 ou 60 !!!” et vous avez raison : ca peut, et c’est entre autre pour ca que porter un jeu 60 (jap ou US) vers 50 (europe) peut etre : a)bacler : on garde tout comme ca, on change pas la frequence de la logique et ca ira pas a la meme vitesse ou B) un peu long : il faut tout porter/adapter/modifier pour que ca tourne a la meme vitesse sur 50 que sur 60 !
voila !!!
et pour les interruptions : ca marche sans doute tres bien dans un micro-controleur de portes d’ascenceurs, mais pour un jeu, y a d’autres trucs a faire avec les interuptions, et puis surtout sur PC, avec winwin et tout le bordel : on fait plus, du tout, jamais, c’est mal !!!
et le delay : oui c’est mal, car ce n’est pas sence etre precis, c’est plus pour dire : arrete toi un peu on va voir ce quisse passes (genre donner un peu de temps aux aurtres thread ou des trucs quoi ) que pour faire un truc vraiment timer aux petits poils !
[oublie le delay + relecture RAPIDE !]
Ce message a été édité par c0unt0 le 21/05/2003