2016-09-01 39 views
1

私はC++でプログラミングを始め、OpenGLで試してみました。現在、私はちょうどキーでカメラを動かす基本的なアプリケーションを持っています。私はこれについて多くの記事を読んでいますが、まだ動きに問題があります。私は少しでも、しかし私のプログラムとは違うからです。最初に60fpsの限界を作り、deltatimeで速度を計算しましたが、動きは遅かったです。今度はFPS制限を無効にしましたが、現在は約4000FPSで動作していますので、deltatimeはほとんどの場合0または1ですので、動きは本当に遅いです。私は概念について何かを理解していないと確信していますが、私はそれを指摘する必要があります。C++ - deltatimeでOpenGLを動かす

メインループ:

while (running) { 
    if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { 

     if (msg.message == WM_QUIT) { 
      running = false; 

      break; 
     } else { 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 
    } else { 
     clock_t last = clock(); 
     deltaTime = last-start; 

     //if ((double)deltaTime >= 16.666666666) { 
     fps++; 
     millis += deltaTime; 
     start = last; 

     if (millis > 1000) { 
      millis = 0; 
      std::cout << "FPS: " << fps << std::endl; 
      fps = 0; 
     } 

     openglContext.renderScene(); 
     //} 
    } 
} 

のWndProcキーハンドラ:

float speed = 5.0f; 

... 

case WM_KEYDOWN: 
    switch(wParam) { 
     case 0x57: 
      openglContext.updateCoordinates(0.0f, 0.0f, ((float)deltaTime/1000.0f * speed), glm::radians(angle)); 
      break; 
    } 
    break; 

私はそれが完璧ではないけど、私は多くの "ソリューション" を試してみました前に私が書いたように。 誰かが助けてくれることを願っています。前もって感謝します!

解決策:

まだ多くはありますが、今は完璧です。

LARGE_INTEGER start; 
LARGE_INTEGER frequency; 
QueryPerformanceFrequency(&frequency); 
QueryPerformanceCounter(&start); 

while (running) { 

    ... 

     LARGE_INTEGER current; 
     QueryPerformanceCounter(&current); 
     dt = ((double)(current.QuadPart - start.QuadPart)/(double)frequency.QuadPart); 
     QueryPerformanceCounter(&start); 

     ... key handling 
     ... render 
     ... 
+1

はの読み取りを持っている:http://gafferongames.com/game-physics/fix-your -timestep/ –

+0

@RichardCritten:それは本当に良いリンクです。しかし、アプリケーションの応答性が重要な場合には、この戦略をカメラ制御に使用しないことをお勧めします。 – BDL

+0

実際に私もそれを読んだことがありますが、それは私のためには少し複雑に思えましたが、多分私はそれを試してみるでしょう。 – matthew3r

答えて

1

delta_timeは0または1のいずれかが原因std::clock()の一般的に低い解像度で起こるという問題。ほとんどの場合、測定可能な最小時間は約0.01秒です。これは、レンダリングアプリケーションの場合よりも少なくなります。 Reference

使用するシステムやコンパイラによっては、タイミングをより正確に測定できるいくつかの方法があります。

+0

ありがとう、私はそれをチェックアウトします。 – matthew3r

+0

私はあなたの答えを受け入れました。それは実装するのが容易ではありませんでしたが、今は動作します。それでもやりたいことはたくさんありますが、今のところ私にとっては完璧です。私の解決策で私の質問も更新します。 – matthew3r

関連する問題