所以,我开始用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(¤t);
dt = ((double)(current.QuadPart - start.QuadPart) / (double)frequency.QuadPart);
QueryPerformanceCounter(&start);
... key handling
... render
...
答案 0 :(得分:1)
由于delta_time
的分辨率通常很低,std::clock()
为0或1的问题发生了。在大多数情况下,可以测量的最短时间约为0.01秒,这对于渲染应用程序来说更少。 Reference
根据您的系统和使用的编译器,有几种方法可以让您以更高的精度测量时序。
high_resolution_clock
)[http://en.cppreference.com/w/cpp/chrono/high_resolution_clock] QueryPerformanceCounter
)[https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx]