PDA

Voir la version complète : [GBA][Aide] Maitriser le Frame Rate à l'aide de Timer?


dienben
08/08/2006, 15h38
Bonjour,

Je suis en train de programmer mon propre moteur de jeu 2D pour faire mon Zelda like maison... rien de bien nouveau allez vous me dire:p

Comme je souhaite améliorer ma maitrise de la GBA, je n'utilise pas de lib existante.

Je cherche a pouvoir fixer (et modifier) le frame-rate de mon jeu. Pour cela, j'ai construit un objet FrameController (un patern observer) qui va notifier à mes différents objets l'arrivée d'une nouvelle frame.

Mon timer va donc déclencher une interruption pour chaque frame et lancer la notification à tous mes objets. Et c'est là ou çà devient compliqué: si le temps de traitement des actions des autres objets devient supérieur au temps entre deux frame, je perds mon controle précis du frame-rate (puisque j'ai pris soin de ne réactiver les interruptions qu'après notification). Mon objet FrameController devient donc inutile...

Bref, comment gérer vous ce problème?

A +,

Dienben

MIKEGBA
08/08/2006, 16h22
Bonjour,

Je suis en train de programmer mon propre moteur de jeu 2D pour faire mon Zelda like maison... rien de bien nouveau allez vous me dire:p

Comme je souhaite améliorer ma maitrise de la GBA, je n'utilise pas de lib existante.

Je cherche a pouvoir fixer (et modifier) le frame-rate de mon jeu. Pour cela, j'ai construit un objet FrameController (un patern observer) qui va notifier à mes différents objets l'arrivée d'une nouvelle frame.

Mon timer va donc déclencher une interruption pour chaque frame et lancer la notification à tous mes objets. Et c'est là ou çà devient compliqué: si le temps de traitement des actions des autres objets devient supérieur au temps entre deux frame, je perds mon controle précis du frame-rate (puisque j'ai pris soin de ne réactiver les interruptions qu'après notification). Mon objet FrameController devient donc inutile...

Bref, comment gérer vous ce problème?

A +,

Dienben

yop !:)

t'embete pas avec des timers pour gerer le framerate !


Une simple routine d'attente de la vbl suffit pour ce que tu veux faire. En gros tu mets le programme en pause dés qe tu as tout calculé, et tu attends la nouvelle vbl par simple interrogation du registre VCOUNT. ( 0x4000006 ). Dés que celui ci=160 , alors c'est tout bon.

Sinon, pour les interuptions, c'est pas glop de pas réactiver les interuptions tout de suite.


ps: à mon avis t'es pas dans la bonne section , je pense que le sujet devrait etre déplacé dans "aide" non ?

Bobby Sixkilla
08/08/2006, 16h33
ps: à mon avis t'es pas dans la bonne section , je pense que le sujet devrait etre déplacé dans "aide" non ?
Je le fais tout de suite. ^^

dienben
08/08/2006, 18h04
Hello,

Oupsss... désolé pour la mauvaise section>_<

Pour la réactivation des interruption, si je ne le fais pas, je risque d'interrompre mon interruption... mais il y a surement un autre moyen.

Le pb d'attendre après mes calcul, c'est que je ne suis pas sur de ne pas dépasser le temps entre 2 frames... mais peut être que pour de la 2D la gba est assez puissante.... comment en être sur?

Merci pour vos réponse, et désolé pour la section...

A +,

Dienben

Alekmaul
08/08/2006, 20h58
Bon alors, perso, pour savoir si je suis toujours dans la VBL, voici comment je fais (mais je suis pas un expert ) :
Ma vbl contient une variable vusCptVbl qui est incrémentée :
void VBLMainInterruptHandler(void) {
// Manage time
++vusCptVBL;

... et d'autres truc comme la maj des sprites en OAM ....


et dans mon code principal, j'ai une boucle infinie while(1) {}
et donc je test cette variable comme cela :
// Tant que ce n'est pas la fin
while ( 1 ) {
// Attend la synchro VBLANK
while (vusCptVBL==0);
vusCptVBL=0;

... Plein d'autre choses ......


Si je suis toujours à 0 au prochain passage, c'est que je suis toujours dans la même VBL ;) CQFD ...

Je sais pas si cela peut t'aider ...