游戏开发:如何限制帧率?

11

我正在编写一款游戏,发现FPS算法无法正确运行(当需要计算更多时,休眠时间变长...)。所以,问题非常简单:如何计算正确的FPS休眠时间?

我知道用微秒来更新游戏一帧需要多长时间,当然也知道我想要达到的FPS。

我疯狂地寻找一个简单的示例,但是找不到....

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


12
通常情况下,您不希望限制FPS。如果有人购买了性能非常好的显卡,他们想要更高的FPS。您应该设计代码,使其测量帧之间的时间(甚至可以在与帧率无关的任意“刻度”上工作),然后根据经过的时间更新游戏对象。如果做得正确,您的游戏在15fps或100fps时都会以相同的方式运行,唯一的区别是动画的流畅程度。 - rmeador
2
@rmeador:超过显示器刷新率的速度几乎没有意义,TFT 显示器通常为 60 Hz(但当然不应该依赖于此)。 - Thomas
1
@rmeador: 但那样会占用全部的CPU资源... - Martijn Courteaux
3
你认为游戏占用所有CPU时间是一件不好的事情,这就是游戏“尽可能快地运行”的含义。现代大多数高性能游戏会占用大部分可用的CPU时间(至少在一个核心上)。 - Quintus
许多现代游戏实现了可选的FPS限制。这使得游戏只运行必要的内容(例如100 FPS或60 FPS),如果用户不希望“尽可能快地运行”。两全其美。 :) - Casey Kuball
如果有人想要写一个正确的答案,而不是下面的那些,这就是如何做到的:http://gafferongames.com/game-physics/fix-your-timestep/ - Prof. Falken
4个回答

16
你应该花费 1/FPS 秒的时间来渲染一帧(例如,如果你的目标是10 FPS,则每帧应该花费1/10 = 0.1秒)。因此,如果渲染需要 X 秒钟的时间,你应该“休眠” 1/FPS - X 秒。
将其转换为毫秒,即可得到...
ms_to_sleep = 1000 / FPS - elapsed_ms;

如果由于某种原因渲染帧花费的时间超过了1/FPS,那么你会得到一个负的睡眠时间,在这种情况下,你显然只需要跳过休眠。


14
每帧的微秒数是1000000 / frames_per_second。如果你知道已经花费了elapsed_microseconds来计算,那么你需要休眠的时间是:
(1000000 / frames_per_second) - elapsed_microseconds

@JS Bangs:嗯...同样的效果...我要检查时间函数。 - Martijn Courteaux

3

Try...

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的规定:


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接