有没有办法在不依赖帧速率的情况下编写游戏?

时间:2014-05-06 14:50:08

标签: ios objective-c sprite-kit

我正在编程一个iOS游戏,并且我使用方法更新来做很多事情,这在游戏速度刷新时调用(目前每秒60次),但问题是如果帧速率下降(例如一个通知,或者游戏中的任何行为,当它被调用时,它会使fps下降一点......)然后就会出现错误....

一个快速的例子是,如果我有一个80张图片的动画,40个用于跳跃,40个用于下降,我需要1,2秒来运行动画,所以如果跳跃花费1,2秒就可以了,动画会运行。但是如果我的fps下降到30,那么动画将会减少,因为它需要2,4秒来运行动画,但跳跃仍然是1,2秒。这只是一个快速的例子,如果帧速率下降,游戏中有很多意想不到的行为,所以我的问题是,游戏开发者是否非常依赖帧速率或者有办法避免那些fps-bug? (编程或任何技巧的另一种方式?)

3 个答案:

答案 0 :(得分:6)

根据时间而不是帧数来确定时间。因此,在每个帧上保存时间戳,并在下一帧上计算已经过去的时间,并根据您的理想帧速率,计算出要前进的帧数。在全速运行时,您不应该注意到差异,当帧速率下降时,您的动画可能会变得不稳定,但动作将永远不会超过应有的帧数。

编辑,因为uliwitness指出,请注意您使用的功能时间,因此您不会遇到问题,例如,当计算机进入睡眠状态或游戏暂停时。

答案 1 :(得分:1)

始终在更新方法中使用delta值。这是平台和引擎独立的。将任何速度或更改值乘以增量值(当前帧和最后帧之间的时间间隔)。

在动画的情况下,解决问题的一种方法是将动画计数器乘以delta(和预期间隔的倒数)。然后舍入此值以获取动画的正确图像。

// currentFrame is a float ivar set to 0 at the beginning of the animation.
currentFrame = currentFrame + delta * 60.0;
int imageIndex = roundf(currentFrame);

然而,使用Sprite Kit有更好的方法来做这种动画,因为有一个预制的SKAction处理精灵动画。

[SKAction animateWithTextures:theTextures timePerFrame:someInterval];

使用此解决方案,您根本不必处理图像的计时。引擎会为你做这件事。

答案 2 :(得分:0)

这里有关于基于FPS和基于时间的技术的很好的讨论:

这是我认为最好的,非常完整,易于理解并提供JsFiddle示例。我将这些示例翻译为C++/Qt

Click here观看我的应用运行视频: