4

我使用opengl制作的游戏有点问题。游戏有时会半速运行,有时会正常运行。

我认为这不是导致问题的 opengl,因为它在我的计算机上以 14,000 fps 的速度运行。(即使它以半速运行)

这使我相信这是导致问题的“游戏计时器”。游戏计时器在单独的线程上运行,并被编程为在其“循环”结束时通过 Sleep(5) 调用暂停。如果我删除 Sleep(5) 调用,它会运行得如此之快,以至于我几乎看不到屏幕上的精灵。(可预测的行为)

我尝试在 Render() 线程的末尾抛出一个 Sleep(16) (也在它自己的线程上)。此操作应将 fps 限制在 62 左右。请记住,该应用程序有时会以预期速度运行,有时会以一半速度运行(我已在我拥有的两台计算机上尝试过并且它仍然存在)。

当它以预期的速度运行时,fps 为 62(好),有时 31-ish(坏)。它永远不会在半速和全速中间执行之间切换,即使重新启动后问题仍然存在。

所以它不是导致缓慢的渲染,它是 Sleep() 函数

我想我说的是 Sleep() 函数与它实际睡眠的时间不一致。这是经过验证的事情吗?我可以使用更好的 Sleep() 函数吗?

4

4 回答 4

5

可等待的计时器(CreateWaitableTimerWaitForSingleObject/或朋友)对于定期唤醒要好得多。

但是,在您的情况下,您可能应该只启用 VSYNC。

于 2013-05-30T04:34:12.353 回答
1

是的,睡眠功能是不一致的,它在宏条件的情况下非常有用。如果你想要一个一致性时间,请使用 QueryPerformanceFrequency 获取 CPU 的频率,并 QueryPerformanceCount 两次用于 start 和 end,然后 (end-start)/frequency 获取一致性时间,但你必须注意如果你的 CPU 是 multilit cores,开始和结束时间可能不是同一个 CPU 内核,所以请我们 SetThreadAffinity 为您的工作线程设置相同的 CPU 内核。

于 2013-05-30T06:26:53.680 回答
1

请参阅以下关于睡眠功能的讨论,重点关注有关调度优先级的内容:http: //msdn.microsoft.com/en-us/library/windows/desktop/ms686298 (v=vs.85).aspx

于 2013-05-30T04:32:02.907 回答
0

有同样的问题。因为我只是制定了自己的睡眠逻辑并为我工作。

#include <chrono>

using namespace std::chrono;

high_resolution_clock::time_point sleep_start_time = high_resolution_clock::now();    

while (duration_cast<duration<double>>(high_resolution_clock::now() - sleep_start_time).count() < must_sleep_duration) {}
于 2017-05-26T00:14:42.333 回答