CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C/SDL] Problème avec le temps.

playstate
playstate
Niveau 8
20 mars 2011 à 19:55:17

Bonjour à tous !

J'essaye de faire un petit jeu de plateforme 2d et donc j'en arrive à la gestion du temps.
J'aimerai en effet que le programme affiche 60 images/seconde (donc une toute les 16ms environ).
Mais il y a un problème : le jeu à l'air de pouvoir être stable en temps mais desfois il crash et ferme.
Je poste la fonction :

void temps(int *tempsPrecedent, char duree) //duree : duree avant la prochaine maj
{
int tempsActuel;
tempsActuel = SDL_GetTicks();
int limit = *tempsPrecedent - tempsActuel + duree; //dans l'exemple duree vaut 16

if (limit >= 16)
{
SDL_Delay(16);
}

else if (limit >= 0)
{
SDL_Delay(limit);
}

*tempsPrecedent = SDL_GetTicks();

}

Le problème vient normalement de la fonction temps car quand je la met en commentaire le prog ne bug pas.

Voila si quelqu'un voit quelque chose d'anormal dans le code merci de me le dire :-)

caelacanthe
caelacanthe
Niveau 10
20 mars 2011 à 20:25:53

il a l'air instable dès que ça commence à être fluide... :peur:

là, tu lui dis d'attendre seize millisecondes s'il s'est écoulé plus de seize ms a la frame précédente, ou d'attendre moins de seize millisecondes s'il s'est écoulé moins de temps a la frame précédente. donc, il attendra toujours moins longtemps, et ton jeu partira en vrille :oui:

a la limite, il faudrait faire un:

if(limit<16)
{
sdl_delay(16-limit);
}

mais sdl_delay, c'est pas très adapté... ca dit a ton programme de s'endormir au moins seize millisecondes, mais tout dépend en réalité du commutateur de processus, et ca donnera un jeu qui rame atrocement si on lance un autre programme un peu lourd à côté. je préfère la boucle while infinie qui fait patienter le programme jusqu'a 16 millisecondes de la précédente frame :oui:

Pocolo
Pocolo
Niveau 10
20 mars 2011 à 20:34:33

Et puis il y a d'autres trucs a moitié louches, pourquoi "tempsPrecedent" est un pointeur? Pourquoi "duree" est un char(même si ça n'a pas tant d'importance)?

playstate
playstate
Niveau 8
20 mars 2011 à 20:56:39

caelacanthe :d) Oui en effet quand on lance un autre programme lourd en même temps le jeu ram plus donc d'après toi il ne faut pas du tout utiliser sdl_delay ? Sinon merci pour ta réponse cela me permet de voir plus clair :)

Pocolo :d) tempsPrecedent est un pointeur pour pouvoir mettre à jour la variable (ici c'est "map.maj"). Mais c'est vrai que je pourrai faire un retour de variable.
Duree est un char car je me suis dit que sa valeur ne sera jamais plus grande que 255.

Voila :)

caelacanthe
caelacanthe
Niveau 10
20 mars 2011 à 21:01:02

et bien, je ne doute pas que sdl_delay aie son utilité mais pour un jeu, on est pas supposé endormir le programme, ce afin de garder une réactivité de tous les instants :oui:

Pocolo
Pocolo
Niveau 10
20 mars 2011 à 21:01:16

Ah et sinon pour voir précisément a quelle ligne ça plante tu devrais lancer en mode débogage.

Mais autrement toute ta fonction là c'est un peu le bordel et un peu trop complexe pour rien en plus, je t'en donnerai une meilleure si tu le souhaites.

playstate
playstate
Niveau 8
20 mars 2011 à 21:13:14

Ok alors je vais tester sans sdl_delay voir le résultat.
Pour le débogage j'avais essayé de voir les valeurs des variables mais elles avaient l'air d'être bonnes.

Sinon je veux bien Pocolo voir ta fonction.
Merci :-)))

Pocolo
Pocolo
Niveau 10
20 mars 2011 à 21:21:58

En dehors du main:

Uint32 startT; //pour stocker le temps au début de la boucle.

int ticks() //int qui retourne le temps écoulé.
{
return SDL_GetTicks() - startT;
}

Puis dans ta boucle:

startT = SDL_GetTicks(); //au tout début de la boucle donc.

if(ticks() < 1000/60) //a la fin de la boucle.
{
SDL_Delay((1000/60) - ticks());
}

Voila, tout simplement.
Puis si tu veux utiliser une boucle plutôt que SDL_Delay comme l'as proposé caelcanthe il te suffit de remplacer le "if" par un "while" et de supprimer ce qu'il y a dans les accolades.

playstate
playstate
Niveau 8
20 mars 2011 à 21:38:30

Extra ta fonction : plus de lag, plus de bug et simple à comprendre ! Que du bonheur :-)
Merci beaucoup ! :oui:

Pocolo
Pocolo
Niveau 10
20 mars 2011 à 21:40:31

Puis si tu veux changer la limite de FPS il te suffit de changer le 60 par un autre nombre. :oui:

tbop2
tbop2
Niveau 10
22 mars 2011 à 08:38:21

Oula. Ca sent le sdz ca encore. Je serais toi je calmerai la dose et je reprendrai les bases parce que tu vas faire n'importe quoi (tu l'as deja fait).

Et j'insiste encore une fois sur la necessite absolue d'ecrire des programmes en anglais pas en francais.

chris_27
chris_27
Niveau 10
22 mars 2011 à 09:29:09

« je préfère la boucle while infinie qui fait patienter le programme jusqu'a 16 millisecondes de la précédente frame » :d) j'ai tendance à tiquer là dessus. C'est TOUJOURS mauvais de faire calculer un programme dans le vent.

« 1000/60 » :d) là aussi je tique. ce n'est pas la même chose que « 1000./60. », attention !

caelacanthe
caelacanthe
Niveau 10
22 mars 2011 à 13:19:05

"Et j'insiste encore une fois sur la necessite absolue d'ecrire des programmes en anglais pas en francais."

:d) pourquoi, au fait? a part qu'un code en français, c'est suffisament différent de ce qui se fait d'habitude que c'en est déroutant et moche :peur:

  1. Chris_27 Voir le profil de Chris_27
  2. Posté le 22 mars 2011 à 09:29:09 Avertir un administrateur
  3. « je préfère la boucle while infinie qui fait patienter le programme jusqu'a 16 millisecondes de la précédente frame » :d) j'ai tendance à tiquer là dessus. C'est TOUJOURS mauvais de faire calculer un programme dans le vent.

:d) je sais, j'utilise cette solution, aussi laide soit-elle, à défaut d'une alternative. tu en connais une, d'ailleurs? a part endormir le programme et se faire préempter à mort. je suis preneur :(

caelacanthe
caelacanthe
Niveau 10
22 mars 2011 à 13:20:32

"c'est tellement* différent" :oui:

Pocolo
Pocolo
Niveau 10
22 mars 2011 à 13:28:45

" :d) pourquoi, au fait? "

C'est vrai que je ne vois pas non plus en quoi c'est une nécessité ABSOLUE. Je code en anglais parce-que je fait tout en anglais sur mon PC et que ça colle mieux avec les keywords mais a part ça je ne vois pas le problème d’écrire des trucs en français. :(

caelacanthe
caelacanthe
Niveau 10
22 mars 2011 à 13:31:43

ça fait des noms de fonctions moins longs, aussi? :(

"getValue" "setValue" :d) "recupereValeur" (sans accents! :malade: ), "attribueValeur" :nah:

Pocolo
Pocolo
Niveau 10
22 mars 2011 à 13:34:40

"Hello World!" ==> "Bonjour Monde!", deux caractères en plus, y'a pas a dire c'est le mal de coder en français. :nah:

chris_27
chris_27
Niveau 10
22 mars 2011 à 15:50:09

« tu en connais une, d'ailleurs ? » :d) heu, sdl_delay() ? :o))

Plus sérieusement, je ne me suis jamais posé cette question dans le cadre d'un jeu. En fait, je me suis posé cette question uniquement dans le caSDL_GetTicks()dre de nachos ( http://www.cs.washington.edu/homes/tom/nachos/ ) et où mettre un while() à la place d'un sleep() est synonyme d'échec cuisant.

À la limite, peut-être qu'un couplage SDL_GetTicks() + usleep() fait l'affaire, tout simplement.

Sinon, moi je suis pour le code en anglais … et pour l'algorithmique en français. D'abord on pose ses idées, les variables qu'on va utiliser avec leur type, etc. en français. Et ensuite on traduit le tout en <insérer ici votre langage de prog favori> + anglais.
L'intérêt de changer de langue entre algorithmique et programmation permet de olus facilement séparer ces deux étapes de la conception d'un code, chose que les gens ne font pas beaucoup en pratique, et on voit ce que ça donne…

PS: c'est quoi l'équivalent windowsien du usleep() ?

chris_27
chris_27
Niveau 10
22 mars 2011 à 15:51:23

dans le cadre* de nachos

Problème de copier-coller (enfin, d'interface chaise-souris pour être franc). :rouge:

caelacanthe
caelacanthe
Niveau 10
22 mars 2011 à 18:48:10

"PS: c'est quoi l'équivalent windowsien du usleep() ?"

:d) on a une fonction Sleep, qui prend des millisecondes en paramètre... mais sdl_delay fait peut-être plus de choses, ils doivent avoir des threads à stopper aussi :(

usleep freeze le programme pendant une durée précise?

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de Jeux
  • Programmation
  • Création de sites web
  • Linux
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment