帧率限制


9

最成功的竞技游戏引擎喜欢id TechGoldSrcSource和这样的允许帧率限制。

您可以玩30、60、99、72、68等。总之,您可以设置其上限并控制上限。

我想知道如何限制帧率?

对代码不感兴趣,但对理论不感兴趣。


出于好奇,除了为其他进程腾出时间之外,这还有什么意义?
3Dave 2012年

1
@DavidLively,想想笔记本电脑,那些以很高的帧速率非常容易过热,而上限为60fps(无论如何,它是无用的,甚至60有点高,应该40可以做到),它们可以更好地控制温度。

对于竞争性游戏,最好有一个均匀的帧频,而不是60到100 fps之间的峰值,因为有时某些动作取决于帧频而不是时间,相等的帧频可以让您感受到这些动作。顺便说一句,请注意,如果启用了VSync,则游戏始终具有等于刷新率的最大fps,因为(驱动程序会负责)。
罗伊(Roy T.)2012年

Answers:


7

理论是:检查上一次渲染帧的时间,如果还没有绘制另一个帧的时间,则不要,然后等待它。


8

假设您要将帧速率限制为60fps,这意味着每帧的渲染时间为1 / 60s = 16,67ms(四舍五入)

要限制帧速率,您只需检查游戏循环开始时的时间,然后就可以将其与游戏循环结束时的时间进行比较:如果相差小于16.67毫秒,则应暂停该时间。

一种方法是使用:

sleep(waittime)

但是,由于sleep(x)产生线程的时间最少为x毫秒,因此您不确定是否会及时获得控制权。

更好的方法是使用:

while(timediff < 16.67ms){ sleep(0); }

这样就产生了线程并要求尽快返回控制。

另一个解决方案是仅具有繁忙的等待循环,这可以为您提供最佳控制,但不必要地使用CPU。

请记住,OS调度程序总是可以从线程中夺走控制权,因此要做好一些准备。


“ 1 / 60s”要明确。:)
理查德·马斯克

这个解决方案真的很糟糕。如果启用了vsync或操作系统决定执行某些操作,则帧速率会波动很大。
塔拉

@Dudeson为什么不好?(这是Quake3 btw中使用的技术)。如果您的FPS低于60,则会跳过循环。所以,它让你的FPS尽可能高,但不会超过60
罗伊T.

@RoyT。有趣的是...您从哪里得到的信息?从源代码?另外,我说循环中等待是不好的,因为这正是我在引擎中执行的方式,这使我很痛苦。问题是,当您打开vsync(在GPU驱动程序中)时,如果您另外尝试限制代码中的帧速率,则会出现很多丢帧现象,因为您的timinig并不是每帧都完美。我只是在谈论vsync问题。没有vsync,这不是问题。而且我不确定vsync在Quake 3天之内是否与今天一样。
塔拉

@Dudeson之前有人向我指出,因为我担心忙碌的等待和睡眠。我现在看到,如果略微错过了垂直同步功能,则可以在30fps和60fps之间波动。但是我想任何技术都会发生这种情况(这不是FreeSync试图缓解的问题)。受代码限制的帧率,或者因为您的计算机无法以60fps的速率渲染,我总是会遇到这个问题:)
Roy T.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.