我应该在我的OpenGL ES游戏中使用多个线程吗?

4

我正在开发一款iPhone游戏,其中包含一个玩家和许多敌人。我使用OpenGL ES来显示游戏画面。

我有点困惑,是应该只使用一个线程还是使用多个线程来移动和控制玩家和敌人。对于这种基本的游戏架构,你有什么建议呢?

2个回答

8
我不同意Max的看法,认为你在应用程序中不应完全忽略使用多线程。OpenGL ES可以从后台线程绘制,但一次只能使用单个线程与OpenGL ES上下文通信。
苹果在iOS OpenGL ES编程指南中有一个名为“Concurrency and OpenGL ES”的完整部分。其中,他们描述了使用多线程提高OpenGL ES应用程序性能的几种情况。
一般来说,建议将耗时操作移到主线程之外。主线程处理应用程序的用户界面,如果阻塞该线程,则会防止标准UI元素更新和触摸事件注册。根据游戏背后正在进行的处理量(物理、人工智能等),您可能需要将其中的大块移至后台线程。
多线程并不是一个简单的话题,但是苹果通过Grand Central Dispatch使这变得更加容易,因此我强烈建议阅读他们的Concurrency Programming Guide,其中描述了实现应用程序中多线程和其他技术的方法。此外,我在iOS开发课程中教授了关于多线程和GCD的课程,视频可以在iTunes U上找到
随着苹果推出多核设备,现在利用多线程和GCD将为您在未来带来巨大的回报。

我根本没有说要忽略多线程(请阅读第二段的第一句话)。 - Max
在结论上,我应该使用主线程来控制用户界面,而使用后台线程来处理逻辑,我是对的吗? - Ali
1
@Ali - 主线程应该用于更新用户界面,不涉及OpenGL ES,响应触摸事件,执行其他不安全的任务(如处理单个Core Data上下文),并且可能作为其他进程的同步点。如果需要处理耗时操作,请将其转移到后台线程(同样,而不是使用手动线程,请考虑使用GCD,因为它会让您的生活变得更轻松)。 - Brad Larson
@BradLarson 我喜欢你在那里得到的“清洁歌词”评级,尽管它是iPhone编程。 - bobobobo

6
这真的取决于很多事情。 首先,如果您使用多个线程(因为所有现代iOS设备都有单核处理器,尽管iPad2有2个),则不会获得任何性能提升。 其次,多个线程使任何应用程序变得更加复杂,因为您必须跟踪共享资源,同步线程等等。
只有在确实需要时才使用多个线程。例如,您从文件中将许多纹理加载到内存中,可能需要几秒钟。如果您在执行渲染的同一线程上执行此操作,则所有渲染都会挂起。因此最好在单独的线程上执行此操作,然后将加载的数据传递给主线程。或者您可以在具有更高更新速率的单独线程上更新物理(但仅在多个核心上才受益)。
如果您是初学者开发人员并制作一些简单的游戏,请勿使用多个线程。这需要很多经验。

仅因应用程序在单核设备上运行并不意味着线程是无用的。任何耗时操作都应在非主线程上执行,以避免阻塞UI(如果可能)。OpenGL ES也可以在后台线程上进行绘制。 - Brad Larson
1
@Brad Larson,抱歉,您是否真正阅读了我所写的内容?请指出我说线程无用的那一行。至于多线程绘图:谢谢,是我的错误(我确信只有在非主线程上执行离屏渲染或纹理渲染才是可能的)。 - Max
我的措辞不够准确,但我是在评论“如果您使用多个线程,则不会获得任何性能提升”的这一行,以及您关于只有在多核系统上在后台线程中执行物理计算才能受益的评论。在单核系统上通过多线程任务确实可以实现性能提升,但更重要的是,通过确保应用程序始终响应,用户可以感知到应用程序更快。您提出了多线程很难的有效观点,但我不希望人们不必要地回避它。 - Brad Larson
@Brad Larson 多线程可以使单核应用程序运行更加平稳,但并不能让它跑得更快(也许会因为内部处理器和操作系统的优化而稍微快一点)。我并不是说我们只能在单独的线程上计算物理问题(这只是一个例子)。我并不反对人们使用多个线程,但我认为对于那些经验较少的开发者来说,现在使用多线程还为时过早。他无法充分利用线程,并且只会给应用程序带来额外的混乱。一切都有其时机。 - Max
@Brad Larson 不要在关于物理学的评论上浪费注意力(我误读了你的回答)。 - Max
随着越来越多的设备变成多核心,这个答案的相关性越来越低。现在我甚至想要给它一个负分。 - Reid Ellis

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