私は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(¤t);
dt = ((double)(current.QuadPart - start.QuadPart)/(double)frequency.QuadPart);
QueryPerformanceCounter(&start);
... key handling
... render
...
はの読み取りを持っている:http://gafferongames.com/game-physics/fix-your -timestep/ –
@RichardCritten:それは本当に良いリンクです。しかし、アプリケーションの応答性が重要な場合には、この戦略をカメラ制御に使用しないことをお勧めします。 – BDL
実際に私もそれを読んだことがありますが、それは私のためには少し複雑に思えましたが、多分私はそれを試してみるでしょう。 – matthew3r