了解FPS及其使用的方法

时间:2010-04-20 17:12:53

标签: c++ c actionscript-3 directx

只关注能够分解每秒帧数如何工作的资源。我知道这跟跟踪Ticks有关,并弄清楚每帧之间发生了多少滴答。但我从来没有遇到任何资源,为什么你必须使用你使用的方法,以获得平滑的框架工作。我想要了解这一点。可以解释或提供任何好的资源吗?谢谢

3 个答案:

答案 0 :(得分:3)

基本上有两种方法。

在ActionScript(和许多其他引擎)中,您请求播放器以特定帧速率调用某个函数。对于Flash游戏,您将帧速率设置为30 FPS,然后您将实现一个侦听ENTER_FRAME事件的功能,以执行您需要执行的操作。这意味着每帧大约可以获得33 ms(1000ms / 30FPS = 33.33ms /帧)。如果你的代码响应ENTER_FRAME需要超过33毫秒,你会得到一些口吃。

在自制的主循环中(例如,您通常在C ++ / SDL中执行),您可以尽快运行主循环。这意味着每帧之间的时间是可变的。你仍然需要保持你的帧码的“胆量”小于33毫秒,以确保你将获得至少30 FPS,但如果不是很多,你的游戏将比30 FPS快。为了解决这个问题,您需要根据自上一帧开始的经过时间对所有逻辑进行编程,并放弃使用帧本身作为时间单位。

答案 1 :(得分:1)

答案 2 :(得分:0)

对于连续可变的帧速率,您可以测量最后一帧所花费的时间,并假设帧将花费相同的时间长度。这有利于意味着时间或多或少地不断地运行。这种方法最大的问题是,VSync'd游戏完全有可能从60 fps变为30 fps,然后再回到后续帧。根据经验,解决此问题的一个好方法是平均最后几帧时间。这样可以平滑结果。在60到30 fps的开关中,每帧将在1/45秒内进行,因此60fps帧运行缓慢,30fps帧运行速度快,感知速度保持在45fps。

最好不要在计算中使用这种时间步。设置自己最低fps ...说10fps。然后,您可以在这些1/10秒间隔的某个倍数处计算所有游戏逻辑。渲染引擎然后知道对象在哪里以及它朝向哪里,因此可以对对象位置进行插值/外推,直到其下一个“决定”帧出现。这有许多优点。它将您的逻辑与渲染完全分离。它允许您在多个帧上分布逻辑计算。例如,在60Hz时,如果逻辑对象每隔6帧保持其路径,则可以测试逻辑对象与世界的相互作用点。这样可以让您在不同的帧上处理一些逻辑对象,从而在整个时间内分散计算负荷。它的最大缺点是,如果帧速率低于目标速率,一切都会变慢。