Pause en millisecondes dans un prog... [C++] - Programmation
Marsh Posté le 10-06-2002 à 12:23:05
oups sorry----->
je suis en train de faire un petit casse brique en OGL et j'aimerais qu'il tourne à peu près à la même vitesse sur des config diff. Je suis sous Visual C++ 6 et j'utlise pas Glut...
Marsh Posté le 10-06-2002 à 13:00:48
ca ?
NOM
usleep - Interrompre le programme durant un nombre donné
de microsecondes.
SYNOPSIS
#include <unistd.h>
void usleep (unsigned long usec);
int usleep(unsigned long usec); /* SUSv2 */
DESCRIPTION
La fonction usleep() suspend l'exécution du programme
appelant durant usec microsecondes. La période de sommeil
peut être allongée par une charge système importante, et
par le temps passé à traiter l'appel de fonction.
Marsh Posté le 10-06-2002 à 13:52:00
je sais pas si faire une pause est le meilleur moyen de ralentir un programme... je pense que ça ne te servira qu'a obtenir une animation saccadée..
à mon avis, une synchro VBL serait bcp plus efficace : tu es assuré que ton programme tourne sur toute config (puisque l'animation se fait en fonction du taux de rafraichissement de l'écran) et tu as la garantie d'une animation fluide
Marsh Posté le 10-06-2002 à 14:49:20
humm, ça ma l'air intérressant cette histoire de synchro...
comment ça marche cette chose?
Marsh Posté le 10-06-2002 à 14:53:26
Glenn a écrit a écrit : oups sorry-----> je suis en train de faire un petit casse brique en OGL et j'aimerais qu'il tourne à peu près à la même vitesse sur des config diff. Je suis sous Visual C++ 6 et j'utlise pas Glut... |
Si tu veux que ton jeu se déroule à la même vitesse qqsoit la config, il faut que tu fasses varier les frames par seconde et non pas ralentir les config rapides.
Marsh Posté le 10-06-2002 à 14:55:55
ouais je sais, mais je sais pas comment faire... je vais me pencher la dessus et fouiller un peu dans le site de Nehe, y me semble avoir déjà vu ça qqpart.
Marsh Posté le 10-06-2002 à 15:05:03
Glenn a écrit a écrit : humm, ça ma l'air intérressant cette histoire de synchro... comment ça marche cette chose? |
Le principe est très simple.
Tu sais que l'image sur ton moniteur est formée grace à un canon à électrons qui bombarde des électrons sur le tube. Ce bombardement se fait à une certaine fréquence, en partant en haut à gauche de l'écran et en finissant en bas à droite. Il bombarde donc une ligne horizontale, revient à la ligne suivante, la bombarde, etc...
Arrivé en bas, le canon remonte pour bombarder une nouvelle image.
La fréquence de bombardement est déterminée par le taux de rafraichissement de ton moniteur. Une fréquence de 100 Hz représente 100 images par seconde, une image étant composée d'un cycle de bombardement complet à partir du haut gauche de l'écran vers le bas droite.
Le VBL (Vertical Blank) représente le moment au cours duquel le canon, une fois arrivé en bas à droite de l'écran, remonte en haut à gauche. Pendant ce laps de temps, tu peux basculer l'écran virtuel vers l'écran réél.
En effet, pour exploiter pleinement le VBL, il te faut 2 surfaces de dessin : une surface qui sera visible à l'écran et une autre surface invisible, sur laquelle tu effectueras toutes tes opérations de tracé.
Pendant que le canon balaye l'écran pour tracer l'image présente sur la surface visible à l'écran, tu effectues tes opérations de tracé dans la surface invisible.
Une fois arrivé en bas de l'écran, tu utilises le temps que met le canon pour remonter (VBL) afin de basculer la surface invisible dans la surface visible, qui sera ainsi tracée par le canon, etc...
Le plus difficile est de déterminer le moment ou le canon a atteint le bas droite de l'écran. Ceci se fait en testant des registres internes à la carte VGA, mais il est possible qu'OpenGL te propose une fonction toute faite. Je sais pas du tout, je connais pas OpenGL. Regarde si une fonction du style "WaitVBlank", "WaitRefresh", etc.. est présente
A+
Marsh Posté le 10-06-2002 à 15:10:36
ok je vois ce que tu veux dire, je vais jeter un coup d'oeil la dessus...
Marsh Posté le 10-06-2002 à 12:13:05
Comment est-ce-qu'on pourrais réalisé une telle pause avec la librairie time.h?
G déjà essayé la fonction delay(int ms) ms elle marche pas...