我应该以什么更新率运行我的固定速率游戏逻辑?
我过去每秒使用60次更新,但这很难,因为它不是每秒更新偶数(16.666666)。我目前的游戏使用100,但对于大多数事情来说这似乎有些过分。
答案 0 :(得分:10)
以上都不是。为了实现最流畅的游戏体验,您的游戏应该是基于时间的,而不是帧锁定的。帧锁定适用于简单的游戏,您可以调整逻辑并锁定帧速率。对于现有的3D标题,帧速率全面跳跃并且屏幕可能不是VSynced,它不能很好地完成。
您需要做的就是弄清楚对象的速度(即每秒虚拟单位),计算自上一帧以来的时间量,缩放虚拟单位数以匹配时间量传递,然后将这些值添加到对象的位置。瞧!基于时间的运动。
答案 1 :(得分:5)
我曾经维护过Quake3 mod,这是用户问题的常见来源。
默认情况下,Q3每秒使用20'刻度 - 图形子系统进行插值,以便在屏幕上获得平滑的运动。我最初认为这种方式很低,但事实证明它很好,并且确实没有很多游戏可以比q3更快地采取行动
我个人认为“足够好的约翰卡马克,对我来说足够好”
答案 2 :(得分:3)
我喜欢固定费率的PC游戏50。我无法真正区分50和60之间的区别(如果你正在制作一款可以/关心你应该达到100的游戏)。
你会注意到问题是'固定费率游戏逻辑'而不是'绘制循环'。为清楚起见,代码看起来像:
while(1)
{
while(CurrentTime() < lastUpdate + TICK_LENGTH)
{
UpdateGame();
lastUpdate += TICK_LENGTH;
}
Draw();
}
问题是TICK_LENGTH应该是什么?
答案 3 :(得分:0)
请记住,除非你的代码被测量到周期,否则每个游戏循环都不会花费相同的毫秒数 - 所以16.6666不合理并不是一个问题,因为你需要时间和补偿。除此之外,它不是每秒16.6666次更新,而是游戏循环应该定位的平均毫秒数。
答案 4 :(得分:0)
这些变量通常最好通过猜测和检查策略找到。
以与刷新无关的方式实现游戏逻辑(例如,将ms / update作为变量公开,并在任何计算中使用它),然后使用刷新直到它工作,然后保持它在那里。
作为一种短期解决方案,如果您希望获得均匀的更新速率但不关心每秒更新的均匀性,则15ms接近60次更新/秒。如果你是两者,你最近的选择是20毫秒或50更新/秒可能是你最接近的。
在任何一种情况下,我都只是将时间视为双倍(或者是高分辨率的长时间),并将游戏的速率作为变量提供,而不是硬编码。
答案 5 :(得分:0)
理想情况是以与显示器相同的刷新率运行。这样你的视觉效果和游戏更新就不会相互进入和不同步。每个帧不会持续整数毫秒的事实对你来说无关紧要;为什么这是一个问题?
答案 6 :(得分:0)
我通常使用30或33.这通常足以让用户感受到流量,并且非常罕见,不会过多地占用CPU。
答案 7 :(得分:0)
通常我不限制游戏的FPS,而是改变我的所有逻辑,将从最后一帧开始经过的时间作为输入。
就固定利率而言,除非你因任何原因需要高利率,否则你应该使用类似25/30的东西。这应该足够了,并且会让你的游戏在CPU使用率上更轻一些。
答案 8 :(得分:0)
您的引擎应该“勾选”(更新)并以垂直同步(vsync)以60fps绘制。此刷新率足以提供:
游戏物理和渲染器都应该能够在需要时丢帧,但优化游戏以尽可能接近60hz标准。此外,像AI这样的一些子系统可以接近10-20fps,并确保您的物理场在帧到帧时间增量上进行插值,如下所示:http://gafferongames.com/game-physics/fix-your-timestep/