C/C++ - 如何管理视频游戏中的循环?

4
我已经用C语言制作了一些小型个人项目的视频游戏。每次遇到的问题都是相同的,如何管理游戏中的循环。
例如,我用SFML编码了一个贪吃蛇游戏。我使用帧速率来处理循环:正常情况下为5帧速率,而通过使用强化道具,我将其更改为10帧速率。这是可行的,但不够简洁,并且在性能较差的计算机上可能无法正常工作。 在相同的想法下,我还制作了一个游戏,在其中决定循环等于循环的一个回合(使用无限循环)。同样的问题是,高性能计算机将比低性能计算机运行得更快。
因此,有没有人可以建议我如何正确和适当地管理视频游戏中的循环?
提前感谢!

1
那是一个非常广泛的话题,不特定于 C/C++。这里有一个很好的概述:http://gafferongames.com/game-physics/fix-your-timestep/(这也可能属于http://gamedev.stackexchange.com/)。 - JoeG
4
这个问题更适合在http://gamedev.stackexchange.com/上进行(可能已经有答案了)。 - Justin
1
你要找的是如何管理帧率。30、50、60帧每秒。 - Captain Obvlious
你在调用window.SetFrameRateLimit(5)吗?如果是的话...你不想这样做。我的建议是,你可以测量自上一帧以来经过的时间,如果这段时间大于你想要的延迟(我认为对于你来说是1/5或1/10秒),那么你就允许移动。否则,你跳过该部分并继续执行。不要将此限制应用于渲染。也不要基于已经过去的帧数,否则像你所说的,高性能计算机会播放得更快。 - SlxS
使用每帧之间的时间差,如果您想将一个角色在屏幕上移动到5米/秒,请找出当前和上一帧之间的时间差,并移动其位置,使其保持5米/秒的速度。这将消除任何性能差异问题。 - andre
显示剩余4条评论
2个回答

6

帧率对游戏玩法不应该有任何影响。如果它的帧率是60FPS或1000FPS,那都不应该对游戏产生任何影响。

你需要做的是查看增量时间或经过的时间,如果这足够的话就进行模拟或启动。

所以当你移动蛇时,它想要每帧移动一定距离。如果帧率低,则移动的距离比帧率高时更大。距离是 speed_it_moves_at * delta_time


上电是一个例子。关键是,如果我向左走,例如使用箭头和循环,除非在主循环中放置 usleep,否则我会非常快。但再次,这很丑陋。 = / 我想要控制游戏速度,不仅仅是帧率。这主要取决于我如何处理游戏的主循环。 - Elfayer
请提供需要翻译的英文内容。 - Andrew
你认为帧跳过怎么样? - Elfayer

5
非常宽泛地说,您需要对游戏状态进行建模,以便它可以按给定的时间增量“前进”,然后,在每个主循环周期内,确定经过了多少时间(通常是几分之一秒),并仅将游戏状态提前这么多。这就是为什么不管帧率如何,游戏都能平稳运行的原因。
该间隔基本上成为所有移动的比例因子。例如,如果您的蛇正以每秒5个距离单位向前移动,并且在主循环期间发现自上次蛇移动以来已经过去了0.01秒,则您会在那个循环期间将蛇提前(0.01 * 5)个距离单位。

我该如何在程序中知道从点A到点B经过的时间? - Elfayer
1
通过检查高精度时间源,这在某种程度上依赖于平台。这对于视频游戏来说是基础性的,因此大多数游戏库提供了更高级别的封装。 - user229044
你认为帧跳过怎么样? - Elfayer

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