这里有一个菜鸟。 我正在使用SFML在C ++中制作一个基本的Pong克隆游戏,但是当我在其他计算机上运行.exe时,程序(对于大多数其他PC)运行速度较慢。 我之前使用过Java并使用这种方式来规范每秒的更新量:
long lastTime = System.nanoTime();
final double ns = 1000000000.0 / 60.0;
double delta = 0;
while(running)
{
long now = System.nanoTime();
delta += (now - lastTime) / ns;
lastTime = now;
while(delta >= 1)
{
update();
delta--;
}
render();
}
}
我打算使用它,但C ++有没有类似Java的System.nanoTime()方法? 我怎么能确保我的程序在不同的计算机上以相同的速度运行(或者至少看起来运行)?
-Windows 7,VS2010。
答案 0 :(得分:1)
对于Windows,您可以尝试timeGetTime
或QueryPerformanceCounter
。前者更容易消化,但准确度稍差。
答案 1 :(得分:1)
您可以使用C ++ 11 <chrono>
标头及其所有时间函数,或者由于您已经在使用SFML,因此可以直接使用其函数。有window.setFramerateLimit(uint)
,如果可能,使用sleep()
来降低CPU使用率,但sleep()
总是有一些不准确之处。然后是window.setVerticalSyncEnabeled(bool)
,它将(解除)激活VSync。这是你最想要的方式,但请记住驱动程序可以强行关闭VSync。
为了跟踪您可以使用sf::Time
和sf::Clock
的时间。 sf::Time
只是一个容纳一定时间跨度的容器,可以很容易地转换为秒,毫秒和微秒。 sf::Clock
只能重新启动,它们不是停止监视(如果您需要这样的功能,请参阅here),但是您可以检索该时间作为sf::Time
对象传递,因为时钟已重置最后。
不要忘记浏览SFML tutorials和documentation,它们包含您想要了解的有关SFML的任何内容。
顺便说一下。使用纳秒更像是一种错觉,它不是很准确,如果你的游戏需要这么小的分辨率,你的游戏逻辑可能需要一些优化。