2011-12-17 3 views
0

J'ai remarqué que lorsque je rends une primitive simple, comme un cube en rotation, et que j'augmente l'angle de 0,1 à chaque passage de la boucle traditionnelle while (! Done), le résultat est est activé par rapport à quand il est éteint (comme changé dans mon panneau de contrôle nVidia) est radicalement différente en termes de vitesse.Synchronisation verticale OpenGL rend le rendu plus rapide

Par exemple, j'utiliser le code suivant:

while (!done) 
{ 
    PeekMessage(&msg, hWnd, NULL, NULL, PM_REMOVE); 

    if (msg.message == WM_QUIT) 
    { 
     done = true; 
    } 
    else 
    { 
     angle += 0.1; 

     if (angle >= 360.0) 
     { 
      angle = 0.0; 
     } 

     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glLoadIdentity();   

     glTranslatef(0.0f, 0.0f, -5.0f); 

     glPushMatrix(); 
      glRotatef(angle, 1.0f, 0.0f, 0.0f); 
      glRotatef(angle, 0.0f, 1.0f, 0.0f); 
      glColor3f(1.0f, 0.0f, 0.0f); 
      glutSolidCube(2.0f); 
     glPopMatrix(); 

     glFlush(); 
     SwapBuffers(hDC); 

     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
} 

Lorsque la synchronisation verticale est forcé désactivé, ce cube tourne beaucoup plus vite que lorsque la synchronisation verticale est forcée sur. Maintenant, dans les jeux, le FPS est verrouillé à 60 fps lorsque la synchronisation verticale est activée, et libre de sauter aussi haut que votre moniteur le permet lorsqu'il est désactivé. Cela a probablement quelque chose à voir avec ça.

Je peux facilement résoudre ce problème en augmentant ou en diminuant mon angle à chaque passage, y a-t-il un moyen de faire tourner mon cube de la même façon malgré l'activation ou la désactivation de vsync?

Répondre

5

Oui, utilisez un delta temporel. Au lieu de faire tourner 0,1 chaque image, vous voudriez faire tourner 0,1 toutes les 20 ms ou quelque chose. De cette façon, il tournera avec la même vitesse indépendamment du fps.

angle += 0.1 * time_elapsed_since_last_tick * some_factor;