Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;-用deltatime实现OpenGL运动 我开始用C++编程,用OpenGL尝试解决问题。目前我有一个基本的应用程序,我只想用按键移动相机。我读了很多关于这个的文章,但我仍然对这个运动有问题,我想是因为即使只有一点点,但它们和我的程序不同。首先,我设定了60 fps的速度限制,并用deltatime计算了速度,但移动速度很慢。现在我关闭了FPS限制,但现在它以4000 FPS左右的速度运行,所以deltatime在大多数情况下是0或1,所以运动非常缓慢。我肯定我不理解这个概念,但我需要指出一点_C++_Opengl - Fatal编程技术网

c++;-用deltatime实现OpenGL运动 我开始用C++编程,用OpenGL尝试解决问题。目前我有一个基本的应用程序,我只想用按键移动相机。我读了很多关于这个的文章,但我仍然对这个运动有问题,我想是因为即使只有一点点,但它们和我的程序不同。首先,我设定了60 fps的速度限制,并用deltatime计算了速度,但移动速度很慢。现在我关闭了FPS限制,但现在它以4000 FPS左右的速度运行,所以deltatime在大多数情况下是0或1,所以运动非常缓慢。我肯定我不理解这个概念,但我需要指出一点

c++;-用deltatime实现OpenGL运动 我开始用C++编程,用OpenGL尝试解决问题。目前我有一个基本的应用程序,我只想用按键移动相机。我读了很多关于这个的文章,但我仍然对这个运动有问题,我想是因为即使只有一点点,但它们和我的程序不同。首先,我设定了60 fps的速度限制,并用deltatime计算了速度,但移动速度很慢。现在我关闭了FPS限制,但现在它以4000 FPS左右的速度运行,所以deltatime在大多数情况下是0或1,所以运动非常缓慢。我肯定我不理解这个概念,但我需要指出一点,c++,opengl,C++,Opengl,主回路: while (running) { if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) { running = false; break; } else { TranslateMessage(&msg); DispatchMessag

主回路:

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();
        //}
    }
}
我知道这并不完美,但正如我之前写的那样,我尝试了许多“解决方案”。 希望有人能帮忙。提前谢谢

解决方案:

还有很多事情要做,但现在已经很完美了

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
        ...

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

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

  • (C++11
    高分辨率时钟
    )[
  • QueryPerformanceCounter
    在Windows中)[

阅读:@RichardCritten:这是一个非常好的链接。但我建议,当应用程序的响应性是一个因素时,不要将此策略用于相机控制。事实上,我也读过它,但它对我来说似乎有点太复杂了,但也许我会尝试一下。@BDL我似乎将相机视为我的物理游戏对象之一它对我的反应足够灵敏。按下一个键可以使相机在适当的方向上瞬间加速。每次相机移动时(它是一个游戏对象)它将自己的速度重置为0。谢谢,我会检查它。我接受了你的答案,它不太容易实现,但现在它工作了。还有很多事情要做,但现在它对我来说是完美的,我也用我的解决方案更新了我的问题。
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
        ...