Accueil Ti-Gen Foire Aux Questions Chat sur le chan #tigcc sur IRC
Liste des membres Rechercher Aide
Bienvenue Invité !   Se connecter             Mes sujets   
Administrer
0 membre(s) et 1 visiteur(s) actif(s) durant les 5 dernières minutes Utilisateurs actifs : Aucun membre + 1 visiteur
Avant de poster sur le forum, il y a des régles de bases à respecter pour une bonne entente et un respect de tous.
Veuillez lire la charte du forum.
  :: Index » Forum Ti68K » Programmation C » Article : Régulation de la vitesse d'un jeu (33 réponse(s))
./POST DE DEPART (post n°0)   Marquer comme non lu.
LionelA Ecrit le: Mardi 28 septembre 2004 à 13:26 Déconnecté(e)    Voir le profil de LionelA Envoyer un email à LionelA Visiter le site WEB de LionelA Envoyer un message privé à LionelA  


Article : Réguler la vitesse dans un jeu

Tout d?abord posons le problème, la vitesse d?exécution d?un jeu peut être différente d?une calculette à une autre si elle n?est pas régulée. En effet, la fréquence du processeur entre modèles HW1 et HW2 étant différente (sans parler des calculatrices overclockées) un jeu non régulé s?exécutera plus vite sur une calculatrice HW2. Cela peut poser des problèmes de gameplay, de synchronisation entre deux calcs connectées via le link, de highscores (time attack), ...
Je propose donc dans cet article une méthode pour réguler la vitesse d?un jeu, se basant sur l?auto interrupt 1 (interruption choisie car rapide et fonctionnant aussi correctement sous VTI).

Il faut savoir que la fréquence de l?auto_int_1 est différente selon le modèle de hardware (cf. j89hw.txt)
Il faut donc d?abord résoudre ce problème :

Le code présenté ci-dessous m?a été généreusement donné par Geoffrey Anneheim (geogeo)

J?ai trouvé la valeur de HARDWARE_FREQUENCY après de multiples tests entre VTI et ma ti89 HW2, il se peut quelle ne soit pas juste a 100% mais la précision suffit amplement

#define HARDWARE_FREQUENCY       20970
static volatile unsigned short counter_hardware=0;

DEFINE_INT_HANDLER (MyInt1)
{
  ExecuteHandler (OldInt1);
  //HARDWARE VERSION 1.0 
  if (HW_VERSION==1)
  {
    //Incrémentation
    counter_hardware+=HARDWARE_FREQUENCY;
  
    //Execution interrupotion
    if (counter_hardware<=32768 )
      return;
    //Remise à zéro
    counter_hardware-=32768;        
  }

  // Exécuter ici le code qui doit se passer avec régulation de la vitesse
}


sur les HW1, ce code a pour effet de sauter des occurrences de l'interrupt 1 pour se re-synchroniser avec l'auto int 1 des HW2,c'est pour ça que OldInt1 (généralement utilisée pour les niveaux de gris et appelée en 1er pour ne pas gêner le déroulement normal de ceux-ci)

OldInt1 est obtenu en sauvegardant le vecteur d?interruption comme ceci :

OldInt1 = GetIntVec (AUTO_INT_1);



méthode de régulation

Certains d?entre vous utilisent une technique de régulation de la vitesse basée sur les interruptions (1 ou 5) mais emploient une mauvaise méthode : attendre dans la boucle principale l?incrémentation d?une variable avec un while et donc bloquer toutes les ressources CPU pendant ce temps d?attente.

Voila la description de la méthode que j?utilise dans le moteur de mode7 (donc dans F-Zero) et qui me semble la meilleure (si quelqu?un a mieux, je suis preneur)

Dans mes projets, je sépare complètement la partie affichage de la partie gameplay, c'est-à-dire que je peux demander un affichage à n?importe quel moment du déroulement du jeu. Cela est possible car je mets tout (sprites, coordonnées, etc...) en global.
De plus cela permet d?accélérer le jeu puisqu?il n?y a plus de passage de paramètres. Même si les professeurs d?informatique vous disent qu?il faut éviter les variables globales pour cause de lisibilité et de maintenance, sur nos machines il vaut mieux en avoir car la moindre ressource économisée n?est pas négligeable.

Nous avons donc une fonction d?affichage qui peut afficher la scène à n?importe quel moment en fonction des données de la scène.
C?est cette fonction qui va prendre la majorité des ressources CPU. Plus la fonction d?affichage est gourmande en ressources, plus les fps (frames per second) seront basses.

La boucle principale du programme appellera donc sans cesse cette fonction.

Vous vous doutez bien que la seule façon de modifier la scène maintenant est de le faire dans l?interruption.

Une façon de le faire est d?appeler une ?fonction de modification? de la scène, fonction qui modifie les données de la scène, dans l?interruption. Comme les données sont globales il est facile de lire le clavier et de modifier la scène en conséquence ou même sans lecture du clavier (exemple : modifier les coordonnées d?un sprite).

Afin de pouvoir changer facilement de mode de modification de la scène, nous utiliserons les pointeurs de fonctions.

Voici un peu de code C :

 #define SHOW_FPS 0 // 0 : don't show, 1 : show fps
#define GAME_SPEED 10 // 0 : the fastest

INT_HANDLER OldInt1 = NULL;
#if SHOW_FPS == 1
char fpsStr[10];
#endif
char hwVersion;
volatile char quit = 0;
char modifying = 0;
char nextModif = 0;
short timeCount = 0;
volatile short fCount = 0;
void (*display_Modif)();

void Display();

// [Thanks to Geogeo from www.tigen.org for this code]
#define HARDWARE_FREQUENCY        20970
static volatile unsigned short counter_hardware=0;

DEFINE_INT_HANDLER (SceneModif)
{
  ExecuteHandler (OldInt1);
  //HARDWARE VERSION 1.0 
  if (hwVersion==1)
  {
    //Incrémentation
    counter_hardware+=HARDWARE_FREQUENCY;
  
    //Execution interrupotion
    if (counter_hardware<=32768 )
      return;
    //Remise à zéro
    counter_hardware-=32768;        
  }
// [/Thanks to Geogeo from www.tigen.org for this code]
  timeCount++;
  if (timeCount == (256))
  {
    timeCount = 0;
#if SHOW_FPS == 1
      PortSet(Plane0,239,127);
      DrawStr (0, 0, "          ", A_REPLACE);
      sprintf (fpsStr, "%d", fCount);
      DrawStr (0, 0, fpsStr, A_REPLACE);
      PortRestore();
#endif
    fCount = 0;
  }
  
  if (!modifying && !nextModif)
  {
    modifying = 1;
    nextModif = GAME_SPEED;
    display_Modif();
    modifying = 0;
  }
  if(nextModif)
    nextModif--;
}


void SetLoopFunc(void (*modifFunc)())
{
  display_Modif = modifFunc;
}


void LoopInit()
{
  quit = 0;
  modifying = 0;
  timeCount = 0;
  fCount = 0;
  hwVersion = HW_VERSION;
  OldInt1 = GetIntVec (AUTO_INT_1);
}

void LoopEnd()
{
  SetIntVec (AUTO_INT_1, OldInt1);  
}

void MainLoop()
{
  SetIntVec (AUTO_INT_1, SceneModif);
  while(!quit)
  {
    Display();
    fCount++;    
  }  
}

void LoopQuit()
{
  quit = 1;
}


Le code ci-dessus déclare un vecteur d?interruption SceneModif, qui utilise la méthode de re-synchronisation HW1/HW2 citée plus haut. Il y rajoute un compteur de frames pour calculer le nombre de fps, ainsi que le blocage de la modification si l?on se trouve déjà en train de modifier (utile si la fonction de modif est trop lourde, mais il vaut mieux l?eviter). Il y a aussi un compteur de modification pour pouvoir choisir la vitesse de jeu (GAME_SPEED).

Pour l?utiliser il faut tout d?abord déclarer une fonction de modif et la passer en paramètre à la fonction d?initialisation de la boucle.

Exemple :
 // fonction de modification de la scene
void jeu()
{
  // c'est ici qu'il faut capter le clavier et changer les coordonnées, animations, etc ... des sprites
  kbd_Scan();
  
  //ex : if le gars est dead, tu peux changer de fonction de modif car il n'y a plus besoin de capter un gameplay
  //dans ce cas tu fais : SetLoopFunc(gameover);
  // si tu veu quitter le jeu tu fais
  if (ESC)
    LoopQuit();
  
}

void game()
{
  // main loop
  SetLoopFunc(jeu);
  LoopInit();
  MainLoop();
  LoopEnd();
}

// Main Function
void _main(void)
{
// inits
  kbd_Init();
  clrscr();
  GrayInit();

  game();
  
  GrayEnd();
  kbd_End();
  PortRestore();
}


Pour finir j?ai déjà regroupé toutes ces features dans un squelette de projet pour TIGCC. Je l?ai fait pour un ami et il fait son jeu avec (peut être qu?un jour il le releasera :D).

Vous pouvez télecharger le zip sur ma page :
skeletor

Vous aurez besoin de extgraph 2.00b3 disponible sur le site de la TICT : ExtGraph Library v2.00 Beta 3

Edit : une faute de français et un bout de code oublié
Edit : j'ai oublié de dire qu'il fallait extgraph
Edit : il serait pas mal de transferer les sources dans la section archives de tigen
Edit : modification des variables et constantes commançant par '_'

-Edité le Mardi 28 septembre 2004 à 23:46 par LionelA-
-Edité le Mercredi 29 septembre 2004 à 12:37 par LionelA-
-Edité le Mercredi 29 septembre 2004 à 12:38 par LionelA-
-Edité le Mercredi 29 septembre 2004 à 23:14 par LionelA-
Auteur de Mode7 Engine pour ti68k
Auteur de F-ZERO for TI68k
Membre de Orage Studio
Mon site perso : http://www.tigen.org/lionela/
Le gite de mes parents à coté de Narbonne :
http://chaletdenis.free.fr/
    
./Post n°1   Marquer comme non lu.
serioussam Ecrit le: Mardi 28 septembre 2004 à 18:14 Déconnecté(e)    Voir le profil de serioussam Envoyer un email à serioussam Visiter le site WEB de serioussam Envoyer un message privé à serioussam  

Tu veux qu'on le mette en ligne dans les articles ?
la shasse é ouvèrte poure lay maychants
    
./Post n°2   Marquer comme non lu.
LionelA Ecrit le: Mardi 28 septembre 2004 à 18:19 Déconnecté(e)    Voir le profil de LionelA Envoyer un email à LionelA Visiter le site WEB de LionelA Envoyer un message privé à LionelA  


Ouais, pourquoi pas ?
Ca serait bien car au moins le topic ne se perdrait pas au fin fond du forum :)
Merci
Auteur de Mode7 Engine pour ti68k
Auteur de F-ZERO for TI68k
Membre de Orage Studio
Mon site perso : http://www.tigen.org/lionela/
Le gite de mes parents à coté de Narbonne :
http://chaletdenis.free.fr/
    
./Post n°3   Marquer comme non lu.
limmt Ecrit le: Mardi 28 septembre 2004 à 19:31 Déconnecté(e)    Voir le profil de limmt Envoyer un email à limmt Visiter le site WEB de limmt Envoyer un message privé à limmt  


ca marche pour TI overclockée?
-Edité le Mardi 28 septembre 2004 à 19:31 par limmt-
http://www.falco-fr.com/ - http://www.jump67.com/ - http://www.msf-league.com/
    
./Post n°4   Marquer comme non lu.
Sasume Ecrit le: Mardi 28 septembre 2004 à 19:39 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

Oui.
    
./Post n°5   Marquer comme non lu.
geogeo Ecrit le: Mardi 28 septembre 2004 à 19:40 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


Pas mal comme tuto. C'est vraiment niquel :)
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°6   Marquer comme non lu.
bobti89 Ecrit le: Mardi 28 septembre 2004 à 20:27 Déconnecté(e)    Voir le profil de bobti89 Envoyer un email à bobti89 Visiter le site WEB de bobti89 Envoyer un message privé à bobti89  

Ouais :) , merci beaucoup !
Dès que j'aurais vraiment le temps, je me pencherais plus sur les codes ! Je pense avoir compris le fonctionnement, et c'est déjà pas mal :)
bob ou bob, vous ne voyez pas la différence. Pourtant il y en a une fondamentale, l'un est écrit à l'endroit, l'autre à l'envers.

Visitez mon site : http://www.bobti89.fr.st
Testez mon forum ici
    
./Post n°7   Marquer comme non lu.
LionelA Ecrit le: Mardi 28 septembre 2004 à 21:24 Déconnecté(e)    Voir le profil de LionelA Envoyer un email à LionelA Visiter le site WEB de LionelA Envoyer un message privé à LionelA  


Je suis content que ca vous plaise :)

Au fait si quelqu'un veut le traduire en anglais (je sais pas si c'est utile...) ça serait cool car j'ai vraiment la flemme de le faire...
-Edité le Mardi 28 septembre 2004 à 23:52 par LionelA-
Auteur de Mode7 Engine pour ti68k
Auteur de F-ZERO for TI68k
Membre de Orage Studio
Mon site perso : http://www.tigen.org/lionela/
Le gite de mes parents à coté de Narbonne :
http://chaletdenis.free.fr/
    
./Post n°8   Marquer comme non lu.
geogeo Ecrit le: Mardi 28 septembre 2004 à 23:54 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


Dari on t'appelle. :p Au pire si il ne se manifeste pas, fait-lui un signe par mini-message. :)
J'ai mis ton topic en annonace, j'espère que ça ne te dérange pas, sinon je le remet comme avant.
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°9   Marquer comme non lu.
LionelA Ecrit le: Mercredi 29 septembre 2004 à 09:07 Déconnecté(e)    Voir le profil de LionelA Envoyer un email à LionelA Visiter le site WEB de LionelA Envoyer un message privé à LionelA  


Pour moi pas de problèmes mais Kevin va peut être râler que ca lui passe devant son topic de bug report :p
Sinon Serioussam m'a proposé de le mettre dans la section articles (en fait je me demande si il sera plus consulté ici ou là bas)
Auteur de Mode7 Engine pour ti68k
Auteur de F-ZERO for TI68k
Membre de Orage Studio
Mon site perso : http://www.tigen.org/lionela/
Le gite de mes parents à coté de Narbonne :
http://chaletdenis.free.fr/
    
./Post n°10   Marquer comme non lu.
Thor Ecrit le: Mercredi 29 septembre 2004 à 10:17 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


Moi je viens de le lire en entier et conclusion ; j'ai pas tout pigé !! Il faut dire que j'ai lu ça en diagonale et à minuit avant de me coucher alors j'étais mort!
Cyril MOTTIER aka {==Thor==}
Modérateur général du forum de Tigen
[Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
Mon site perso c'est ici
    
./Post n°11   Marquer comme non lu.
LionelA Ecrit le: Mercredi 29 septembre 2004 à 10:21 Déconnecté(e)    Voir le profil de LionelA Envoyer un email à LionelA Visiter le site WEB de LionelA Envoyer un message privé à LionelA  


S'il te plait, tu pourrais me dire la/les partie(s) difficile(s) à comprendre afin que je détaille plus.
(Je ne me rends pas compte car c'est evident pour moi :D)
Auteur de Mode7 Engine pour ti68k
Auteur de F-ZERO for TI68k
Membre de Orage Studio
Mon site perso : http://www.tigen.org/lionela/
Le gite de mes parents à coté de Narbonne :
http://chaletdenis.free.fr/
    
./Post n°12   Marquer comme non lu.
Thor Ecrit le: Mercredi 29 septembre 2004 à 10:25 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


LionelA :
S'il te plait, tu pourrais me dire la/les partie(s) difficile(s) à comprendre afin que je détaille plus.
(Je ne me rends pas compte car c'est evident pour moi :D)
Oui pas de problème mais d'abord je vais le relire à tête reposée!
Y'a déja un truc que je ne pige pas car tu fais :
//Incrémentation
    __COUNTER_HARDWARE+=__HARDWARE_FREQUENCY;
  //Execution interrupotion
    if (__COUNTER_HARDWARE<=32768 )
      return;
    //Remise à zéro
    __COUNTER_HARDWARE-=32768;

Le problème c'est que la remise à zéro ne ce fait pas par __COUNTER_HARDWARE=0.
Cyril MOTTIER aka {==Thor==}
Modérateur général du forum de Tigen
[Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
Mon site perso c'est ici
    
./Post n°13   Marquer comme non lu.
LionelA Ecrit le: Mercredi 29 septembre 2004 à 10:43 Déconnecté(e)    Voir le profil de LionelA Envoyer un email à LionelA Visiter le site WEB de LionelA Envoyer un message privé à LionelA  


Ca c'est la partie de geogeo :D

En fait, le commentaire "//Remise à zéro" n'est pas juste,
le fonctionnement c'est :
a chaque passage dans le code de l'interruption on incremente le compteur et si il n'a pas dépassé 32768, on ne fait rien.

au début:
__COUNTER_HARDWARE est égal à 0

premier passage :
on l'incremente -> il passe a 20970
on return sans rien faire.

deuxieme passage :
on l'incremente -> il passe a 41940
on retranche 32768 -> il passe a 9172
on execute le code necessaire.

troisieme passage :
on l'incremente -> il passe a 30142
on return sans rien faire

etc...

Ce systeme permet de creer un decalage qui se reporte a chaque passage dans le code du vecteur d'interruption et ca simule au mieux une fréquence de 256Hz (fréquence de l'autoint1 sur HW2) à partir d'une interruption a 370Hz sur HW1 (je suis pas sûr de la fréquence là...)
Auteur de Mode7 Engine pour ti68k
Auteur de F-ZERO for TI68k
Membre de Orage Studio
Mon site perso : http://www.tigen.org/lionela/
Le gite de mes parents à coté de Narbonne :
http://chaletdenis.free.fr/
    
./Post n°14   Marquer comme non lu.
geogeo Ecrit le: Mercredi 29 septembre 2004 à 12:10 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


Plus précisément on travail avec des virgules fixes pour avoir une interruption de 256 Hz (HW2) sur HW1 car l'auto int n°1 sur HW1 tourne à 310 Hz environ.

[EDIT] Kevin va surtout râler parce que j'utilise des underscores genre __COUNTER.... :p
-Edité le Mercredi 29 septembre 2004 à 12:12 par geogeo-
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°15   Marquer comme non lu.
Kevin Kofler Ecrit le: Mercredi 29 septembre 2004 à 22:59 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


Oui, évitez les variables commençant par un underscore (et encore pire 2 underscores) s'il vous plaît! Ces variables sont réservées pour l'implémentation (GCC, GNU as, ld-tigcc, TIGCCLIB).
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°16   Marquer comme non lu.
LionelA Ecrit le: Mercredi 29 septembre 2004 à 23:01 Déconnecté(e)    Voir le profil de LionelA Envoyer un email à LionelA Visiter le site WEB de LionelA Envoyer un message privé à LionelA  


bon je les vire de l'implementation et je vais mettre les noms des variables en minuscules aussi car les maj sont pour les constantes
Auteur de Mode7 Engine pour ti68k
Auteur de F-ZERO for TI68k
Membre de Orage Studio
Mon site perso : http://www.tigen.org/lionela/
Le gite de mes parents à coté de Narbonne :
http://chaletdenis.free.fr/
    
./Post n°17   Marquer comme non lu.
geogeo Ecrit le: Jeudi 30 septembre 2004 à 13:14 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


méeuh
-Edité le Mercredi 5 janvier 2005 à 20:53 par geogeo-
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°18   Marquer comme non lu.
Thor Ecrit le: Jeudi 30 septembre 2004 à 14:52 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


geogeo :
méeuh
:D
Cyril MOTTIER aka {==Thor==}
Modérateur général du forum de Tigen
[Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
Mon site perso c'est ici
    
./Post n°19   Marquer comme non lu.
LionelA Ecrit le: Samedi 15 janvier 2005 à 23:16 Déconnecté(e)    Voir le profil de LionelA Envoyer un email à LionelA Visiter le site WEB de LionelA Envoyer un message privé à LionelA  


Alors il semblerait que cette méthode qui consiste à executer beaucoup de code dans le handler d'interruption ne soit pas une bonne chose (probleme de design).
Pourtant je l'utilise depuis presque un an sans jamais avoir eu le moindre problème :)

Donc je ne sais pas s'il vaut mieux retirer ou non cet article. A vous de voir...
Auteur de Mode7 Engine pour ti68k
Auteur de F-ZERO for TI68k
Membre de Orage Studio
Mon site perso : http://www.tigen.org/lionela/
Le gite de mes parents à coté de Narbonne :
http://chaletdenis.free.fr/
    
  :: Index » Forum Ti68K » Programmation C » Article : Régulation de la vitesse d'un jeu (33 réponse(s))
Pages : 1/2     « [1] 2 » »|

.Répondre à ce sujet
Les boutons de code
[B]old[I]talic[U]nderline[S]trikethrough[L]ine Flip Hori[Z]ontallyFlip [V]erticallySha[D]ow[G]low[S]poilerCode [G][C]ite
Bullet [L]istList Item [K] Link [H][E]mail[P]icture SmileysHelp
Couleurs :
Saisissez votre message
Activer les smileys
     

Forum de Ti-Gen v3.0 Copyright ©2004 by Geoffrey ANNEHEIM
Webmaster: Kevin KOFLER, Content Admins: list, Server Admins: Tyler CASSIDY and Kevin KOFLER, DNS Admin: squalyl
Page générée en 58.23ms avec 18 requetes