如何让程序在不同的计算机上以相同的速度运行?

时间:2014-01-19 22:50:44

标签: c++ performance windows-7

这里有一个菜鸟。 我正在使用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。

2 个答案:

答案 0 :(得分:1)

对于Windows,您可以尝试timeGetTimeQueryPerformanceCounter。前者更容易消化,但准确度稍差。

对于非Windows用户,您可以使用clocktime。那里还有很多其他人。

答案 1 :(得分:1)

您可以使用C ++ 11 <chrono>标头及其所有时间函数,或者由于您已经在使用SFML,因此可以直接使用其函数。有window.setFramerateLimit(uint),如果可能,使用sleep()来降低CPU使用率,但sleep()总是有一些不准确之处。然后是window.setVerticalSyncEnabeled(bool),它将(解除)激活VSync。这是你最想要的方式,但请记住驱动程序可以强行关闭VSync。

为了跟踪您可以使用sf::Timesf::Clock的时间。 sf::Time只是一个容纳一定时间跨度的容器,可以很容易地转换为秒,毫秒和微秒。 sf::Clock只能重新启动,它们不是停止监视(如果您需要这样的功能,请参阅here),但是您可以检索该时间作为sf::Time对象传递,因为时钟已重置最后。

不要忘记浏览SFML tutorialsdocumentation,它们包含您想要了解的有关SFML的任何内容。

顺便说一下。使用纳秒更像是一种错觉,它不是很准确,如果你的游戏需要这么小的分辨率,你的游戏逻辑可能需要一些优化。