Pages: [1] 2 3 ... 5   Bas de page
Imprimer
Auteur Fil de discussion: [nds/palib]Accélérer le vbl  (Lu 6091 fois)
0 Membres et 1 Invité sur ce fil de discussion.
Toiletking Hors ligne
Mega Member
***
Messages: 1293


Voir le profil WWW
"Caca Boudin!"

« 29 Novembre 2007, 15:00:24 »

Bonjour à tous!

Juste pour savoir si il existe une méthode, pour accélérer le vbl avec palib?

En fait je voudrais écrire une fonction qui permette d'accélérer le vbl général, et donc d'accélérer le jeux... Parce qu'en fait, tout ce que je sais faire c'est augmenter l'incrémentation pour accélérer l'affichage de mes scrolling, de mes textes... mais bon, des fois, j'ai tout qui s'affiche en même temps, plusieurs fonctions s'activent, et je voudrais bien que ca fasse VBL X 5 quand le stylet touche l'écran Azn

Une idée? J'ai gratté les fonctions VBL de la palib, mais je les comprend pas (fallait pas être une noob  Cry )

Un exemple typique dans les jeux : dans les phase de transition entre les niveaux, on peut accélérer la narration, en appuyant sur x...

Journalisée
Cid2Mizard Hors ligne
Super Mega Member
****
Messages: 4064


Voir le profil WWW
Disciple Kukulcanien

« Réponse #1 : 29 Novembre 2007, 15:13:19 »

Lis ça ==> VBL
Journalisée

Toiletking Hors ligne
Mega Member
***
Messages: 1293


Voir le profil WWW
"Caca Boudin!"

« Réponse #2 : 29 Novembre 2007, 15:33:23 »

Merci cid ! Smiley

Mais ca ne m'explique malheureusement pas comment faire... En fait je cours pas après une augmentation du nombre d'image pas seconde... pour que ca soit plus fluide,  Je veux juste accélérer le tout Azn Donc c'est pas grave si on reste à 60 images par seconde, si on pouvait diviser les vbl, ca serait super Azn
Journalisée
The_Pimousse Hors ligne
Sr. Member
****
Messages: 353


Voir le profil
« Réponse #3 : 29 Novembre 2007, 15:42:51 »

Attention le VBL... c'est le raffraichissement de(s) l'ecran(s) ... le moment ou le dernier pixel de la derniere ligne est mis a jour si je ne me trompe pas.
C'est du hardware pur et dur... Tu ne peux donc pas agir dessus... Enfin si tu peux le ralentir si tu occupes assez le systeme pour qu'il n'a pas le temps de raffraichir l'ecran... mais tu perds des FPS !
Journalisée

L'experience, c'est le nom que l'on donne a ses erreurs
frozenjazz Hors ligne
Full Member
***
Messages: 209


Voir le profil
« Réponse #4 : 29 Novembre 2007, 16:25:28 »

Toiletking, je n'ai pas suivi le début du fil, mais euh... j'ai peut-etre une suggestion, c'est ce que je fais personnellement:

j'ai en gros une fonction de recalcul/affichage globale, qui est appelée à chaque tour de boucle (donc 60 fois par seconde). Et j'ai un u32 timer  que j'incrémente à chaque fois.
Jusque là, rien de bien méchant...

Et ensuite je joue avec ce timer pour faire des calculs de temps d'attente... Pour mon bête jeu LineCS, j'ai rendu tout paramétrable avec des #define pour les animations par exemple, car je voulais pouvoir régler la vitesse d'apparition / disparition des blocs.

C'est tout con en fait, je mémorise la valeur de timer dans timer_debut_anim par exemple, et je ne mets à jour mon animation que si timer - timer_debut_anim > une_certaine_valeur  ...    et une_certaine_valeur représente en 60èmes de seconde le temps d'attente...

Ca marche carrément bien, et du coup comme ca je gère mon simili multithread où on a l'impression qu'on peut faire plusieurs choses à la fois...

« Dernière édition: 29 Novembre 2007, 16:28:26 par frozenjazz » Journalisée
EvilTroopa Hors ligne
Administrateur
*****
Messages: 648


Voir le profil WWW
1010011010 the Number of the Beast

« Réponse #5 : 29 Novembre 2007, 16:31:03 »

Petite approche à l'arrache...

Je mettrais un facteur commun à toutes tes variables relatives aux vitesses de tes sprites, scrollings, etc...
Il faut que tu multiplies tes vitesses au moment où tu gères le déplacement de tes sprites et le(s) scrolling(s).

Genre :
Code:

if (stylus.Held){
   facteur_vitesse = 5;
}else{
   facteur_vitesse = 1;
}

sprite_vX = 2 * facteur_vitesse;
sprite_vY = 1 * facteur_vitesse;

PosX += sprite_vX;
PosY += sprite_vY;

PA_SetSpriteXY(... , PosX, PosY, ...);

Quand tu cliques au stylet, tu passes cette variable à 5. Ca va tout faire aller 5 fois plus vite.
Journalisée

A mushroom a day, keeps the koopas away.
Toiletking Hors ligne
Mega Member
***
Messages: 1293


Voir le profil WWW
"Caca Boudin!"

« Réponse #6 : 29 Novembre 2007, 16:43:03 »

ah c'est sympa pour vos réponses les gars! Azn

Spoon, c'est vrai ta solution est carrément bien, va juste falloir que je rajoute le facteur vitesse à chaque fois que j'incrémente! Bon ca doit être simple à mettre en place, en espérant que ca va me faire planter le bazar... (j'ai un petit problème avec certain valeur à décimal, mais ca doit être gérable en faiant attention au comparaison >= et =<  Azn)

Par contre Frozen, j'ai pas tout compris pour le Multithread  Shocked, mais ca à l'air super super intéressant, surtout, quand tu parle d'action simultané (c'est cho à gerer tout ca...) Smiley Pourrais tu fournir un exemple concret? (plus concret que ton exemple concret  Grin )

Edit : merci encore les gars!  Azn
Journalisée
frozenjazz Hors ligne
Full Member
***
Messages: 209


Voir le profil
« Réponse #7 : 29 Novembre 2007, 16:45:32 »

Euh, la réponse de Spoon, nickel chrome pour gérer la "vitesse" d'un sprite, mais j'ai du mal interpréter, je pensais que tu voulais changer la vitesse de certains "évènements", comme par exemple l'affichage de la page suivante...

Mouaip, faut que je nettoie encore mon code de LinesCS... avant de le publier...

EDIT: bon c'est noyé dans d'autres choses dans le code, donc tu ne comprendrais pas l'idée de base...

en fait, dans ma boucle principale j'ai:

Code:
u32 timer = 0;

while(1)  {
        refreshEverything();
PA_WaitForVBL();       
        timer++;
        ...
}

et ensuite un peu partout je joue avec ce timer...

Par exemple, pour afficher mes nouveaux pions, qui apparaissent les uns après les autres, c'est tout bête en fait: chaque case du tableau mémorise plein de choses, mais entre autres j'ai:

Code:
typedef struct {
   u32 timeforupdate;
   bool mustbeupdated;
   ...
   u8 color; // 0 is empty
} Tcell;

quand je veux ajouter un nouveau bloc j'appelle cette fonction là:

Code:
void addNewBlock(u8 num, u32 timeforupdate) {
    ...
    blockstoadd[num] = xy;
    ...
    cell->timeforupdate = timeforupdate;
    cell->color = nextcolors[num];
    cell->mustbeupdated = true;
    nbblockstoadd++;
    ...
    ...
}

et ensuite dans mon refreshEverything() j'appelle:

Code:
  
    if (cell->mustbeupdated && (cell->timeforupdate==timer || cell->timeforupdate==0)) {
       updateCellGfx(x, y);
   }

ca veut dire en "langage naturel" que si ma case doit être mise à jour, et qu'il est effectivement l'heure de sa mise à jour, ou alors qu'il n'y a pas d'heure et que je dois la mettre à jour tout de suite (ça, c'est moi qui ai convenu que 0 = mise à jour immédiate), alors... je la mets à jour.

J'espère que c'est plus concret ... Smiley




« Dernière édition: 29 Novembre 2007, 17:03:08 par frozenjazz » Journalisée
frozenjazz Hors ligne
Full Member
***
Messages: 209


Voir le profil
« Réponse #8 : 29 Novembre 2007, 17:08:39 »

Bon, dans mon exemple au dessus, j'utilise une variable "timeforupdate", mais ca peut être plus simplement que à un moment donné dans ton programme, tu mémorise un "temps", par exemple

timer_last_page_display = timer;

et puis à chaque tour de boucle tu appelles display_next_page()
 seulement tu n'affiches réellement la page suivante que si par exemple timer - timer_last_page_display > 120; si tu veux espacer les affichages de deux secondes...

Je ne sais pas comment expliquer plus clairement...

L'idée c'est que finalement tu demandes à tout réafficher à chaque tour de boucle, mais qu'avec des booléens et des timers mémorisés, et bien tu ne raffiches que certaines choses...

Au début j'utilisais des "sleep()" qui n'étaient rien d'autre que des PA_WaitForVBL en boucle, mais du coup je ne pouvais pas à la fois déplacer un pion tout en affichant l'animation de la disparition d'une ligne... Ca marchait mais le jeu n'était pas ultra réactif, fallait toujours attendre la fin d'une action pour en commencer une autre...
« Dernière édition: 29 Novembre 2007, 17:11:57 par frozenjazz » Journalisée
The_Pimousse Hors ligne
Sr. Member
****
Messages: 353


Voir le profil
« Réponse #9 : 29 Novembre 2007, 17:10:50 »

Attention frozenjazz, si ta boucle ne mets pas plus d'1 VBL pour s'executer, ca marche ... sinon... non ;-)
Par contre il existe des compteurs tout prets dans la PA_Lib (PA_StartCounter(x) ... ou quelque chose comme ca...) qui eux sont incrementes a chaque VBL.
Journalisée

L'experience, c'est le nom que l'on donne a ses erreurs
PypeBros Hors ligne
Hero Member
*****
Messages: 707


Voir le profil WWW
Posez-vous les bonnes questions

« Réponse #10 : 29 Novembre 2007, 17:15:56 »

et bêtement
Code:
u32 timer = 0;

while(1)  {
        for (i=0;i<refresh_speed;i++) recomputeEverything();
PA_WaitForVBL();       
        update_sprite_tables_etc();
        timer++;
        ...
}

?

De toutes façon, si tu change les attributs d'un sprite entre deux VBL, il n'y en aura jamais qu'un qui sera pris en compte (la valeur des attributs au moment où les lignes de l'écran sur lequel ce sprite se trouve sont "redessinées")... Cf. toutes les démos techniques de Mollusk sur les HBL...
Journalisée

frozenjazz Hors ligne
Full Member
***
Messages: 209


Voir le profil
« Réponse #11 : 29 Novembre 2007, 17:26:39 »

Attention frozenjazz, si ta boucle ne mets pas plus d'1 VBL pour s'executer, ca marche ... sinon... non ;-)
Par contre il existe des compteurs tout prets dans la PA_Lib (PA_StartCounter(x) ... ou quelque chose comme ca...) qui eux sont incrementes a chaque VBL.

ah tiens faut que je regarde le PA_StartCounter...
Euh, je ne suis pas encore guru en fait... je ne fais pas des calculs monstrueux donc je pense qu'ils passent dans un tour de boucle... mais tu as raison...

bon alors ce qu'il nous faut c'est un vrai timer, et non pas un pseudo timer basé sur un incrément à chaque tour de boucle supposé. Si PA_StartCounter fait ca...

Mais ma technique en fait, c'est celle qu'utilise le "Zi" de Mollusk... Smiley
Journalisée
The_Pimousse Hors ligne
Sr. Member
****
Messages: 353


Voir le profil
« Réponse #12 : 29 Novembre 2007, 17:32:36 »

Mais ma technique en fait, c'est celle qu'utilise le "Zi" de Mollusk... Smiley
HS : d'apres un message quelque part dans ce forum, Mollusk disait que dans la XFSlib, tout etait gere en soft... ce qui fait que sur mon petit PDA, Zi rame un peu :-D
PS : j'espere que j'ai bien compris les propos du guru et que je ne deforme pas trop :-D
Journalisée

L'experience, c'est le nom que l'on donne a ses erreurs
frozenjazz Hors ligne
Full Member
***
Messages: 209


Voir le profil
« Réponse #13 : 29 Novembre 2007, 17:34:21 »

et bêtement
Code:
u32 timer = 0;

while(1)  {
        for (i=0;i<refresh_speed;i++) recomputeEverything();
PA_WaitForVBL();       
        update_sprite_tables_etc();
        timer++;
        ...
}


ah ben non !! Moi je veut appeler mon refreshEverything() le plus souvent possible !!!
Mais par contre bien sur, j'optimise, je ne refresh pas vraiment tout, d'où mon "mustbeupdated"....

Citation
De toutes façon, si tu change les attributs d'un sprite entre deux VBL, il n'y en aura jamais qu'un qui sera pris en compte (la valeur des attributs au moment où les lignes de l'écran sur lequel ce sprite se trouve sont "redessinées")... Cf. toutes les démos techniques de Mollusk sur les HBL...

heing ?? là j'apprends quelque chose... tu es sur à 100% de ce que tu dis ?? Je ne comprends pas pourquoi ce serait le cas... ?
Journalisée
frozenjazz Hors ligne
Full Member
***
Messages: 209


Voir le profil
« Réponse #14 : 29 Novembre 2007, 17:35:59 »

HS : d'apres un message quelque part dans ce forum, Mollusk disait que dans la XFSlib, tout etait gere en soft... ce qui fait que sur mon petit PDA, Zi rame un peu :-D
PS : j'espere que j'ai bien compris les propos du guru et que je ne deforme pas trop :-D

oui, mais ca ne remet pas en cause l'idée tu timer++ à chaque tour de boucle, non ?
Tout est fait en soft, oui, sur PDA il n'y a pas de couche hardware qui gère les sprites... je pense que c'est ca qu'il veut dire...
Journalisée
Pages: [1] 2 3 ... 5   Haut de page
Imprimer

Aller à: