c ++ - 具有deltatime

时间:2016-09-01 08:44:30

标签: c++ opengl

所以,我开始用C ++重新编程,并尝试使用OpenGL。目前我有一个基本的应用程序,我只想用键移动相机。我读了很多关于这个的文章,但我仍然对这个动作有问题,我想因为即使只是一点点,但它们与我的程序不同。首先我制作了60 fps的限制并用deltatime计算速度,但是运动是滞后的。现在我关闭了FPS限制,但现在它以大约4000 FPS运行,所以deltatime大部分时间都是0或1,所以运动真的很慢。我确定我对这个概念并不了解,但我需要指出它。

主循环:

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 个答案:

答案 0 :(得分:1)

由于delta_time的分辨率通常很低,std::clock()为0或1的问题发生了。在大多数情况下,可以测量的最短时间约为0.01秒,这对于渲染应用程序来说更少。 Reference

根据您的系统和使用的编译器,有几种方法可以让您以更高的精度测量时序。