【问题标题】:Game Development: How to limit FPS?游戏开发:如何限制 FPS?
【发布时间】:2010-06-23 15:07:15
【问题描述】:

我正在写一个游戏,我看到 FPS 算法不能正常工作(当他必须计算更多时,他睡得更久......)所以,问题很简单:如何计算睡眠时间FPS 正确吗?

我知道以微秒为单位更新一帧游戏需要多长时间,当然还有我想要达到的 FPS。

我正在疯狂寻找一个简单的例子,但我找不到......

代码可能是 Java、C++ 或伪......

【问题讨论】:

  • 通常您不想限制您的 FPS。如果有人为非常好的显卡付费,他们想要更高的 FPS。您应该设计您的代码,以便它测量帧之间的时间(甚至可以在与帧速率无关的任意“滴答声”上工作),然后使游戏对象根据该经过的时间进行更新。如果操作正确,您的游戏将以 15fps 或 100fps 的速度播放,唯一的区别是运动的流畅度。
  • @rmeador:快于显示器的刷新率(在 TFT 显示器上通常为 60 Hz)没有什么意义(当然,这不应该被依赖)。
  • @rmeador:但这会吃掉所有的 CPU...
  • 为什么你认为游戏用完所有 CPU 时间是一件的事情?这就是游戏“尽可能快地运行”的含义。大多数现代高性能游戏会占用大部分可用的 CPU 时间(至少在一个内核上)。
  • 许多现代游戏实现了可选的 FPS 限制。如果用户不希望“尽可能快地运行”,这允许游戏仅运行必要的(例如 100 FPS 或 60 FPS)。两全其美。 :)

标签: java c++ algorithm frame-rate


【解决方案1】:

您应该花在渲染一帧上的时间是1/FPS 秒(如果您的目标是 10 FPS,那么您应该在每一帧上花费 1/10 = 0.1 秒)。因此,如果渲染需要X 秒,您应该“休眠”1/FPS - X 秒。

将其转换为例如毫秒,您会得到

ms_to_sleep = 1000 / FPS - elapsed_ms;

如果由于某种原因渲染帧的时间超过1/FPS,您将获得负睡眠时间,在这种情况下您显然只是跳过睡眠。

【讨论】:

    【解决方案2】:

    每帧的微秒数是1000000 / frames_per_second。如果你知道你已经花了elapsed_microseconds计算,那么你需要睡觉的时间是:

    (1000000 / frames_per_second) - elapsed_microseconds
    

    【讨论】:

    • @JS Bangs:嗯……效果一样……我去看看时间函数。
    【解决方案3】:

    试试……

    static const int NUM_FPS_SAMPLES = 64;
    float fpsSamples[NUM_FPS_SAMPLES]
    int currentSample = 0;
    
    float CalcFPS(int dt)
    {
        fpsSamples[currentSample % NUM_FPS_SAMPLES] = 1.0f / dt;
        float fps = 0;
        for (int i = 0; i < NUM_FPS_SAMPLES; i++)
            fps += fpsSamples[i];
        fps /= NUM_FPS_SAMPLES;
        return fps;
    }
    

    ...根据http://www.gamedev.net/community/forums/topic.asp?topic_id=510019

    【讨论】:

      【解决方案4】:

      看看this关于不同FPS处理方法的文章。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多