OVH Cloud OVH Cloud

[Débutant] Timers

5 réponses
Avatar
Cyrcocq
Bonjour;

J'en suis à mes premiers essais dans le domaine des timers mais...

J'ai fait un p'tit truc qui m'indique la résoultion des ticks à l'aide de la
fonction GetSystemTimeAdjustment
et qui m'indique combien d'itération de boucle vide on peut faire entre 2
tick...
Et ce truc, je l'ai fait tourner sur plusieur machines. A chaque fois, ma
fenetre m'indique le tick à lieu toutes les 15625 microsecondes.

C'est vrai sur toutes les machines ou non?

J'imagine que non, mais je n'ai pas pu tester sur toutes les machines que
j'ai trouvé, j'ai des problémes d'initialisation de l'appli sur certaines
machines...


Sinon, je me suis penché sur les "multimedia timer"
Mais je rencontre un ptetit probléme de compilation:

calculs temporels error LNK2001: symbole externe non résolu "unsigned int
__stdcall timeGetDevCaps(struct timecaps_tag *,unsigned int)"
(?timeGetDevCaps@@$$J18YGIPAUtimecaps_tag@@I@Z)

Qu'est ce que vous en pensez?

Et à propos de ces multimédia timers le
timeGetSystemTime
Il donne autre chose que le GetTickCount???


De toutes façons, je vais me lancer dans le "high résolution timer"...


Sinon, pour synchroniser l'évolution d'une boucle faisant de l'affichage sur
le temps passé indépendamment du matériel, quels fonctions vous me
conseillez?
Parce qu'en fait tout ce qui précéde part de petites animations (toutes
bétes) en OpenGL qui tournaient vachement bien sur des vieux duron avec un
pov carte vidéo et qui vont vraiment méchament trop vite sur un Athlon 2600+
avec une radeon 9800 pro.

5 réponses

Avatar
Cyrcocq
> Sinon, je me suis penché sur les "multimedia timer"
Mais je rencontre un ptetit probléme de compilation:

calculs temporels error LNK2001: symbole externe non résolu "unsigned int
__stdcall timeGetDevCaps(struct timecaps_tag *,unsigned int)"
(?timeGetDevCaps@@$$J18YGIPAUtimecaps_tag@@)

Qu'est ce que vous en pensez?



Bon cette partie là, j'ai trouvé, il fallait que je dise explicitement que
j'utilisais le WinMM.Lib
Avatar
Aurelien Regat-Barrel
Cyrcocq a écrit :
Bonjour;


Bonjour,

J'en suis à mes premiers essais dans le domaine des timers mais...

J'ai fait un p'tit truc qui m'indique la résoultion des ticks à l'aide de la
fonction GetSystemTimeAdjustment
et qui m'indique combien d'itération de boucle vide on peut faire entre 2
tick...
Et ce truc, je l'ai fait tourner sur plusieur machines. A chaque fois, ma
fenetre m'indique le tick à lieu toutes les 15625 microsecondes.

C'est vrai sur toutes les machines ou non?



Non. Il me semble que ça te donne la valeur du time-slice, qui varie en
fonction de l'OS et du nombre de processeurs. Mais c'est dans ces eaux
là (sous NT, 10 ms pour un monoproc / 15 pour un multi il me semble).

De toutes façons, je vais me lancer dans le "high résolution timer"...



Un petit lien à ce sujet:
http://www.sysinternals.com/Information/HighResolutionTimers.html

--
Aurélien Regat-Barrel
Avatar
Cyrcocq
Excusez moi, mais j'y reviens.

Bonjour;
...



Sinon, pour synchroniser l'évolution d'une boucle faisant de l'affichage
sur le temps passé indépendamment du matériel, quels fonctions vous me
conseillez?
Parce qu'en fait tout ce qui précéde part de petites animations (toutes
bétes) en OpenGL qui tournaient vachement bien sur des vieux duron avec un
pov carte vidéo et qui vont vraiment méchament trop vite sur un Athlon
2600+ avec une radeon 9800 pro.




Et j'ajoute:
J'ai lu que les timer prennaient beaucoup de temps porcesseur. Comment
économiser ces ressources mais avoir le même résultat sur toutes les
machines? (la même distance parcourue à l'exclusion du nombre d'image par
secondes)
Avatar
Aurelien Regat-Barrel
> Et j'ajoute:
J'ai lu que les timer prennaient beaucoup de temps porcesseur. Comment
économiser ces ressources mais avoir le même résultat sur toutes les
machines? (la même distance parcourue à l'exclusion du nombre d'image par
secondes)



Une idée comme ça:
- un thread de dessin (le thread principal)
- un thread de controle du dessin (un nouveau thread créé avec une
priorité élevée)


HANDLE hPaintSync; // event de controle du dessin

// thread de priorité elevée
void control_thread()
{
while ( play_animation )
{
// envoyer un ordre de dessin tous les 50 ms
WaitForSingleObject( GetCurrentThread(), 50 );
SetEvent( hPaintSync );
}
CloseHandle( hPaintSync );
}

// thread de dessin
int main()
{
// initialiser
create_sync_event_and_control_thread();

// boucle de dessin
while ( play_animation )
{
paint();
// attendre un ordre de dessin
WaitForSingleObject( hPaintSync, INFINITE );
}

// libérer...
}

Bref, tu vois l'idée...

--
Aurélien Regat-Barrel
Avatar
Cyrille Szymanski
"Cyrcocq" wrote in
news:431766fa$0$21293$:

Et j'ajoute:
J'ai lu que les timer prennaient beaucoup de temps porcesseur. Comment
économiser ces ressources mais avoir le même résultat sur toutes les
machines? (la même distance parcourue à l'exclusion du nombre d'image
par secondes)



Comme indexer la fonction de dessin sur l'horloge et non d'autres compteurs
tels que le nombre de passages dans la fonction de dessin par exemple ?

Du genre "position = f(horloge)" au lieu de faire "position++" à chaque
passage dans la boucle.

--
Cyrille