gpt4 book ai didi

c++ - 带增量时间的 OpenGL 运动

转载 作者:行者123 更新时间:2023-11-30 05:23:19 29 4
gpt4 key购买 nike

因此,我再次开始使用 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 key 处理程序:

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

最佳答案

delta_time 为 0 或 1 的问题是由于 std::clock() 的分辨率普遍较低所致。在大多数情况下,可测量的最短时间约为 0.01 秒,这对于渲染应用程序来说是少得多。 Reference

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

关于c++ - 带增量时间的 OpenGL 运动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39266748/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com