2011-12-17 13 views
0

回転キューブのような単純なプリミティブをレンダリングしたときに、従来のwhile(!done)ループを通過する角度をそれぞれ0.1ずつ増加させると、垂直同期(nVidiaのコントロールパネルで変更されたように)オフになっているかどうかは、スピードの点で大幅に異なります。OpenGL垂直同期でレンダリングが速くなる

例えば、私は、次のコードを使用します。垂直同期を強制的にオフにした場合

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); 
    } 
} 

、このキューブは、垂直同期を強制的にオンにしたときよりもはるかに高速で回転します。現在、ゲームでは、垂直同期が有効になっているときにFPSが60 fpsにロックされ、無効になっているときにモニターが許可した高さまで自由にジャンプできます。これはおそらくそれと関係があります。

私は、パスごとに角度を増減することで簡単にこの問題を解決できます.vsyncのオン/オフにもかかわらず、同じ方法でキューブを回転させる方法はありますか?

答えて

5

はい、時間デルタを使用します。フレームごとに0.1を回転させるのではなく、20 msまたは何かごとに0.1を回転させたいでしょう。そうすれば、fpsに関係なく同じ速度で回転します。

angle += 0.1 * time_elapsed_since_last_tick * some_factor; 
関連する問題