我能否构建一个多线程系统来处理游戏中的事件,并根据优先级将它们独立地排序成不同的线程,这是一个好主意吗?
以下是更多信息:
我即将开始将一个中等大小的游戏从Flash/AS3移植到Java,这样我就可以继续使用多线程功能进行开发了。
下面是游戏的一些背景:
游戏包含许多异步活动,如“世界更新”(游戏环境根据一套自然规律和力量不断变化)、地形的过程生成、NPC、任务、物品等,除此之外,玩家与环境的所有交互的效果都是根据一组不断变化的“统计”和再一次自然规律和力量,实时地编程计算出来的。
所有这些事情同时进行,以异步的方式,似乎很适合自己的多线程。
我的问题是:
当这些事件被触发时,我是否可以构建某种中央引擎来处理所有这些事件的“堆叠”,并在可用的线程中动态地对它们进行排序,这是一个好主意吗?
例如:
本质上,每当事情发生时(IE,咒语产生的一枚魔法导弹,或一群植物需要生长到下一阶段),而不只是在此时处理这个任务并将新对象(S)添加到托管对象列表中,而是将该事件的引用发送到一个核心“事件处理程序”,该核心“事件处理程序”将其抛入其他所有当前排队事件的堆栈中,然后根据紧急情况对它们进行排序和命令,然后将它们拆分到多个可用线程之间,以便尽可能快地执行多线程。
发布于 2012-08-16 14:41:48
啊,Java中的并发性:-)。好吧,所以我要给你一些一般性的建议:
有点!
发布于 2012-08-16 14:55:09
所有这些事情同时进行,以异步的方式,似乎很适合自己的多线程。
对我来说似乎正好相反。
你的“世界”是一个巨大的变化无常的状态,当与多线程结合在一起时,它会导致各种各样的噩梦。
最大的问题是:当两个并行处理的事件以矛盾的方式影响世界的同一部分时,会发生什么?如何防止事件处理器代码看到不一致的世界状态?这个问题有许多微妙的不同的变体。
也许最终会发现这样的情况是罕见的,任何由此产生的不一致都是可以容忍的,但如果不这样做,它将导致巨大的头痛,这可能会扼杀这个项目。
这里有一篇关于多线程游戏体系结构的有趣(虽然很短)的文章。这里有一个更深入的文章,它也提到了同步是许多游戏使用单线程游戏循环的一个问题和原因。它声称通过“非先发制人的多线程”可以很大程度上避免这样的问题,但我不确定这到底是如何工作的。
发布于 2012-10-15 23:52:23
任务和基于事件的多线程可以非常好地工作--您的想法与我目前在本地C++中的多线程工作有相似之处。您从线程开始,每个线程在应用程序中都有自己定义良好的角色,它们将通过在它们之间发布要运行的任务和事件来相互协作。
每个线程都执行自己的任务,并不时地处理自己的事件和任务,这些事件和任务一直在排队。虚拟阻塞状态使等待的线程在阻塞时工作。每个线程都成为一个事件处理器,没有任何事情可做成为唯一的硬阻止方式。
获得多线程权限确实很复杂,但随着优先级系统的增加,它变得更加复杂。无论如何,大多数事件都必须按照发布的顺序发生,优先级可以在最意想不到的地方重新排序,导致饥饿。记住,你必须能够调试这些东西。我只保留正常和低优先级的队列,并在任务中使用一个低优先级标志在post(事件)时选择队列。在选择使用优先系统之前,要真正知道你正在从你的优先权系统中得到实实在在的信息。
该模型可以很好地扩展到任意数量的处理器,因为它是分散的,并且允许所有线程同时发布和处理事件。往返于不同处理器上的线程之间的一项任务需要500次以下的机器周期,即使是较短的任务也是如此。任务和事件执行速度很快,其数据现在包含在目标线程中,可以滚动。
https://softwareengineering.stackexchange.com/questions/161122
复制相似问题