我发现大多数游戏开发需要一个主游戏循环,但我不知道为什么它是必要的.我们不能实现事件监听器并响应每个用户操作吗?然后可以在事件发生时播放动画(等).
主游戏循环的目的是什么?
Jus*_*eff 80
你"需要循环,因为否则调用事件监听器"的论点并不成立.不可否认,在任何主流操作系统中,你确实有这样的循环,并且事件监听器确实以这种方式工作,但完全有可能使中断驱动的系统在没有任何类型的循环的情况下工作.
但你仍然不希望以这种方式构建游戏.
使循环成为最具吸引力的解决方案的是你的循环成为实时编程中被称为"循环执行"的循环.这个想法是你可以使各种系统活动的相对执行率相互确定.循环的整体速率可以由定时器控制,并且该定时器最终可能是一个中断,但是对于现代操作系统,您可能会看到该中断的证据作为等待信号量(或其他一些同步机制)的代码你的"主循环"的一部分.
那么为什么你想要确定性的行为呢?考虑用户输入和坏人AI的相对处理率.如果你把所有东西都放在一个纯粹的基于事件的系统中,那么不能保证AI不会比你的用户获得更多的CPU时间,反之亦然,除非你对线程优先级有一些控制权,即便如此,你也是容易让时间保持一致.
然而,将所有内容放在一个循环中,您可以保证您的AI时间线将按照用户的时间以固定的关系进行.这可以通过从循环中调出来为AI提供一个时间片来决定做什么,调用用户输入例程,轮询输入设备以了解用户想要表现的行为,以及呼吁做你的渲染.
有了这样一个循环,你必须注意到你没有花费更多的时间来处理每个传递,而不是实际实时传递.如果你试图以100Hz的频率循环你的循环,你所有的循环处理最好在10毫秒内完成,否则你的系统会变得不稳定.在实时编程中,它被称为超越你的时间范围.一个好的系统可以让你监控你超越的程度,然后你就可以减轻你认为合适的处理负荷.
sho*_*osh 16
无论您是否看到,事件侦听器还依赖于某些调用循环.还有谁会打电话给听众?
构建一个明确的游戏循环使您可以绝对控制正在发生的事情,因此您不会依赖于某些工具包/事件处理库在其事件循环中所做的事情.
游戏循环(高度简化如下)
initialise
do
input
update
render
loop
clean up
这将在游戏绘制的每一帧发生.因此对于以60fps运行的游戏,上面每秒执行60次.
这意味着游戏运行平稳,游戏保持同步,每个周期的更新/抽取频繁发生.动画只是眼睛的一招,物体在不同地点之间移动,但是当播放得足够快时,它们似乎在这些地点之间移动.
如果您只更新用户输入,则游戏只会在用户提供输入时做出反应.其他游戏组件,如AI游戏对象不会自己做出反应.因此循环是更新游戏的最简单和最好的方式.
并非所有类型的游戏都需要专用的主游戏循环.
由于频繁的对象更新和游戏输入精度,动作游戏需要这样的循环.
另一方面,我实施了扫雷游戏,并使用窗口
消息进行通知.