对于简单游戏,是否有单独的游戏循环线程是必需的?


10

我是游戏开发的新手。为了学习,我正在android平台上重新创建游戏。您可以在上面的链接中观看游戏视频。这是一个简单的游戏。

我已经阅读了很多有关游戏开发入门的文章,几乎所有文章都建议在单独的线程上使用游戏循环,这对于其他游戏也很有意义。但是,对于这个特定的游戏,我需要启动一个单独的线程吗?



不确定是否重复,因为这与Android有关。与基于Java的平台中的线程有关的其他注意事项与该问题有所不同。
肖恩·米德迪奇

Answers:


8

通常建议使用游戏循环,因为它很简单。几乎所有游戏都可以通过循环来正确开发和运行,并且大多数游戏都需要一个才能正常运行。

例如,大多数物理引擎需要可靠的不断更新以进行正确的仿真。动画,其他动态内容和图形需要进行每次更改等更新。通过使用循环,您几乎可以自由地进行操作。

现在请注意,您的循环不必在单独的线程上运行。实际上,为简单起见,大多数游戏都会在主线程上运行循环。甚至我的Android项目都遵循这一原则。

现在,这里真正的问题是提出什么替代方案?如果您对如何可靠地获取输入还有其他想法,请进行更新并画出适合您的框架,然后继续!否则,游戏循环可能是最简单的前进方式。


我正在考虑的替代方法是使用主线程本身来更新屏幕,因为所有动作都是连续进行的-玩家在相同颜色的球上滑动,然后所有触摸的球消失,其余的球与替换球一起在重力作用下掉落。
jin

因此,您不是在问是否需要循环吗?您主要关心的是是否必须在单独的线程上,对吗?
AturSams 2014年

1
正确。我的问题是关于线程而不是循环。对于这样简单的游戏(尽管我很幸运能够做出这样的游戏),我是否需要产生一个新线程,或者所有事情都可以在主线程上完成?
jin

1
不,这是没有必要的。只要您有一个循环,就无需创建第二个循环

@jin,您应该真正更改标题以及然后如何编写问题。
vallentin 2014年

5

不需要单独的线程。如果您没有做任何过于激烈的事情(在您向我们展示的游戏中情况并非如此),那么所有事情都可以在主线程上完成。

如果您正在执行大量处理或以其他方式遇到UI /输入无响应的问题,则需要第二个线程。例如,在更复杂的游戏中,您不希望在AI计算下一步动作时UI /输入不响应。由于您的游戏似乎主要是在响应用户输入和更新视觉效果,因此不需要第二个线程。


回答“是否需要循环”原始问题。

,但是替代方案更复杂,更难实现且很少使用。

根据定义,游戏是交互式的。至少,它在等待输入并更新输出。最简单的方法是使用循环。不需要为此生成新线程。

即使您提到的游戏看起来很简单,但它具有互动的视觉效果和声音,并且会根据用户输入不断对其进行更新。

游戏循环也没有很多其他选择。基于中断的某种系统是可能的。但是,这样的系统增加了复杂性并减少了诸如确定性之类的其他因素。游戏循环如此普遍是有原因的,它们易于实现,易于理解,具有灵活性并且做得很好。


我唯一遇到下级中断的时间是当完成某个硬件任务并且需要通知CPU / OS以便他们可以正确处理它时(将数据从磁盘读取到内存中,然后通知它已经准备好,以便我们可以返回控制应用程序并允许它处理它),所以我不知道您的意思,只是误解了它。
AturSams 2014年

2

回答实际问题(游戏循环是否需要在单独的线程中进行):

人们经常建议使用单独的线程的原因是,他们不希望繁重的处理过程干扰UI交互性。您是唯一可以判断您的游戏是否需要单独线程的人。当前设计中的主要游戏循环是否会干扰UI的响应时间,这完全取决于引擎和框架。以为您通常会认为(在小型项目中)不会,除非您有其他想法。

将代码保留在单独线程中的另一个原因是使代码保持模块化和简单。从长远来看,将两个不相关的代码片段混合在一起通常会导致代码变得不那么可读和难以维护。

游戏循环是否需要在其自己的单独线程上运行?可能吧 如果响应时间或代码存在问题,并且无论繁重的处理工作都需要多个UI项来响应,或者您只是希望将代码分解为由于设计原因而同时发生的特定任务,然后再进行处理。但是,它被认为是高级编程实践。

一个简单但也许不是很好的例子来说明一个两人游戏。您可能需要运行一个类的两个实例,这些实例处理用户输入并转换为玩家角色实例中的状态更改。

某些框架鼓励/要求您使用像ActionScript3.0这样的基于事件/中断的系统。在这种情况下,循环代码通常会转至该OnEnterFrame事件或每秒发生20-60或120次的类似事件。


原始问题的答案(我需要一个主循环):

一切都归结为程序计数器。如果您要制作的游戏将运行超过预定的时间并且不会生成代码,那么您将需要请用户的PC重复一些已经处理过的指令,以及可能会改变的指令。同时是状态(存储在游戏对象和全局变量中的值)。

由于您知道需要重复说明,因此有多种方法可以完成此任务并不断处理相同的说明。所有这些方法都涉及将程序计数器移回当前相关的指令。导致代码重复的最常见的控制流语句称为循环,另一种是goto在现代代码中很少使用的语句,在这种情况下具有类似的效果(与您完全无关)。

因此,要回答上一个问题,是否需要循环?是的你是。


1
据我所知,基于事件的框架(如AS3)仍然在下面运行游戏循环。我说的是较低级别的中断,而不是实现事件系统的框架。
MichaelHouse

嗯..我不认为人们经常在游戏中使用较低级别的中断。AFAIK它们主要由CPU用来监视IO操作。我在考虑将较高级别的抽象作为一种设计实践,在这种设计实践中,您响应用户输入或硬件活动(不进行轮询),而不是每帧运行几条指令,然后告诉硬件渲染结果。
AturSams 2014年

1
是的,人们不再经常使用它们了。就像我说的那样,它们更难使用,并且我们现在有更好的做事方法。我理解您的意思,这当然是思考事物的另一种方式,但只是表面上看起来有所不同,而在同一循环类型下。
MichaelHouse

我同意@ Byte56,它可以归结为一个循环,除非我们正在谈论使用IO中断的内核级事件。
concept3d 2014年

1
我知道,但是我们所做的大多数事情在表面之下都是一样的(就像我说的那样,更改程序计数器的值)。这不是秘密,我在答案中指出了这一点。基于事件的编程似乎有所不同,因为当发生不同的事件时,我们会将程序计数器移至不同的功能。显然,可能有一个循环轮询来检查这些事件是否最近发生,但作为设计原则,它似乎有所不同。
AturSams 2014年

0

只是在这里添加了其他人的答案,没有人明确提到过这一点:如果确实冒着在第二个线程中运行游戏循环的风险,并且该循环变得无响应,则可能会导致操作系统终止应用程序。这就是为什么建议使用单独的线程。因此,(例如)NDK的native_app_glue.c/会.h为您的循环生成一个单独的线程。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.