首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该构建一个多线程系统来处理游戏中的事件,并根据优先级将它们独立地排序为不同的线程吗?

我应该构建一个多线程系统来处理游戏中的事件,并根据优先级将它们独立地排序为不同的线程吗?
EN

Software Engineering用户
提问于 2012-08-16 14:13:52
回答 5查看 2.6K关注 0票数 3

我能否构建一个多线程系统来处理游戏中的事件,并根据优先级将它们独立地排序成不同的线程,这是一个好主意吗?

以下是更多信息:

我即将开始将一个中等大小的游戏从Flash/AS3移植到Java,这样我就可以继续使用多线程功能进行开发了。

下面是游戏的一些背景:

游戏包含许多异步活动,如“世界更新”(游戏环境根据一套自然规律和力量不断变化)、地形的过程生成、NPC、任务、物品等,除此之外,玩家与环境的所有交互的效果都是根据一组不断变化的“统计”和再一次自然规律和力量,实时地编程计算出来的。

所有这些事情同时进行,以异步的方式,似乎很适合自己的多线程。

我的问题是:

当这些事件被触发时,我是否可以构建某种中央引擎来处理所有这些事件的“堆叠”,并在可用的线程中动态地对它们进行排序,这是一个好主意吗?

例如:

本质上,每当事情发生时(IE,咒语产生的一枚魔法导弹,或一群植物需要生长到下一阶段),而不只是在此时处理这个任务并将新对象(S)添加到托管对象列表中,而是将该事件的引用发送到一个核心“事件处理程序”,该核心“事件处理程序”将其抛入其他所有当前排队事件的堆栈中,然后根据紧急情况对它们进行排序和命令,然后将它们拆分到多个可用线程之间,以便尽可能快地执行多线程。

EN

回答 5

Software Engineering用户

回答已采纳

发布于 2012-08-16 14:41:48

啊,Java中的并发性:-)。好吧,所以我要给你一些一般性的建议:

  1. 将异步处理建模在白板上,然后让其他人来挑战您的假设,特别是假设您首先需要它(听起来像是您需要的,但挑战它也没有坏处)。您可以使用大量并发数据结构来建模您想要实现的目标,请参阅我提到的Brian的书,以获得关于这些事情的良好实用指南(在Java中)。
  2. Java中的并发性是硬的--默认情况下对象是可变的,隐式锁定很难得到正确的处理,而且您通常需要处理底层构造,即线程本身。如果要用Java完成这项工作,请阅读Brian在实践中的优秀Java并发性,以确保您避免了主要的陷阱。Java 7再次改进了一些东西,但是仍然有一些基本问题使它变得困难(目前而言)。
  3. 给定2.值得研究一下JVM上的一个框架,甚至另一种语言,它是从这个框架中抽象出来的。当今流行的选择包括Akka框架( Scala和Java支持)、GPars (Groovy)或(如果您喜欢的话)。

有点!

票数 8
EN

Software Engineering用户

发布于 2012-08-16 14:55:09

所有这些事情同时进行,以异步的方式,似乎很适合自己的多线程。

对我来说似乎正好相反。

你的“世界”是一个巨大的变化无常的状态,当与多线程结合在一起时,它会导致各种各样的噩梦。

最大的问题是:当两个并行处理的事件以矛盾的方式影响世界的同一部分时,会发生什么?如何防止事件处理器代码看到不一致的世界状态?这个问题有许多微妙的不同的变体。

也许最终会发现这样的情况是罕见的,任何由此产生的不一致都是可以容忍的,但如果不这样做,它将导致巨大的头痛,这可能会扼杀这个项目。

这里有一篇关于多线程游戏体系结构的有趣(虽然很短)的文章。这里有一个更深入的文章,它也提到了同步是许多游戏使用单线程游戏循环的一个问题和原因。它声称通过“非先发制人的多线程”可以很大程度上避免这样的问题,但我不确定这到底是如何工作的。

票数 4
EN

Software Engineering用户

发布于 2012-10-15 23:52:23

任务和基于事件的多线程可以非常好地工作--您的想法与我目前在本地C++中的多线程工作有相似之处。您从线程开始,每个线程在应用程序中都有自己定义良好的角色,它们将通过在它们之间发布要运行的任务和事件来相互协作。

每个线程都执行自己的任务,并不时地处理自己的事件和任务,这些事件和任务一直在排队。虚拟阻塞状态使等待的线程在阻塞时工作。每个线程都成为一个事件处理器,没有任何事情可做成为唯一的硬阻止方式。

获得多线程权限确实很复杂,但随着优先级系统的增加,它变得更加复杂。无论如何,大多数事件都必须按照发布的顺序发生,优先级可以在最意想不到的地方重新排序,导致饥饿。记住,你必须能够调试这些东西。我只保留正常和低优先级的队列,并在任务中使用一个低优先级标志在post(事件)时选择队列。在选择使用优先系统之前,要真正知道你正在从你的优先权系统中得到实实在在的信息。

该模型可以很好地扩展到任意数量的处理器,因为它是分散的,并且允许所有线程同时发布和处理事件。往返于不同处理器上的线程之间的一项任务需要500次以下的机器周期,即使是较短的任务也是如此。任务和事件执行速度很快,其数据现在包含在目标线程中,可以滚动。

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/161122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档