我该如何处理AI线程与主游戏循环之间的通信?

时间:2011-12-09 17:05:25

标签: java android multithreading artificial-intelligence

我正在研究基于回合制的Java战略游戏(在Android框架中)。按照Beginning Android Games中的结构,我有一个渲染线程和一个UI线程。渲染线程重复更新世界状态,然后重绘世界。当用户与屏幕交互时,GUI将动作发送到世界(命令模式)。现在我正在添加AI玩家,这是我的计划:

每个AI播放器都有一个在单独的线程上运行的AI。

当世界更新AI时,它会检查是否有待处理的操作。如果是这样,它会执行它。然后它要求AI播放器进行下一步操作。

AI播放器会将操作请求发送到AI线程,然后返回。

最终,AI会提出一个动作,并将其发回给世界,它将在下次更新时看到它。

两个问题:

1)这种设计看起来是否合理?

2)如何处理与AI线程之间的通信?如果我有AI线程调用world.queueAction(action),看起来它会工作,但是如果渲染线程调用ai.chooseAction(world)将在渲染线程上运行选择操作,这不是我想要的。

3 个答案:

答案 0 :(得分:4)

我会为AI提供一个ExecutorService,并为你想要它执行的任务添加任务。对于UI,您可以拥有已更改并可能需要重新绘制的事物队列。我会很想为所有AI使用单个线程,直到你知道这会有所帮助。大多数Android设备无论如何都只有1-2个CPU。

答案 1 :(得分:2)

您确定系统能够处理大量线程吗?请记住,“最佳”运行线程数通常是n + 1,其中n是系统具有的核心数。如果这是在手机上运行,​​那么可用的数量会减少,但除非您的运行时间超过10,否则可能会好起来......

对于游戏与AI之间的联系,考虑(人类)玩家与AI之间的区别可能会有所帮助:只有一个重要的区别 - 一个是计算机,另一个不是。最好将AI采取的行动提交到与人类玩家完全相同的队列(或通过相同的一般机制)(因此,请致电world.queueAction(action);)。它还可以简化AI和人类玩家之间的交换,因为您的世界更新代码不需要知道差异...

我假设你已经有某种事件通知播放器/更新屏幕,当它是人类玩家的回合时。对AI线程执行完全相同的操作 - 让它监听相应的“轮到你”事件,使其完成(此迭代)计算并对队列执行操作。请注意,这需要从'world update'线程完成;渲染线程应该只关注将输出渲染到屏幕上(并且只与玩家输入相关)。

答案 2 :(得分:1)

如果我理解正确:

  • 你有一个渲染线程。据推测,这是以显示帧速率运行。
  • 你有一个"世界逻辑"线。这是从一些可预测的计时器开始的。
    • 您在一个线程中拥有一般物理,玩家输入或其他操作;
    • 每个AI角色都有一个单独的帖子

看起来你可以安全地将每个AI逻辑线程作为Future运行,然后在做了其他任何事情之后一起拿起他们的结果" world"线程正在做,每帧。