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

Java 我应该如何处理AI线程和主游戏循环之间的通信?,java,android,multithreading,artificial-intelligence,Java,Android,Multithreading,Artificial Intelligence,我正在用Java开发一个基于回合的策略游戏(在Android框架中)。按照Android游戏开始时的结构,我有一个渲染线程和一个UI线程。渲染线程反复更新世界状态,然后重新绘制世界。当用户与屏幕交互时,GUI向世界发送操作(命令模式)。现在我正在添加AI玩家,以下是我的计划: 每个AI玩家都会有一个在独立线程上运行的AI 当世界在AI回合中更新时,它会检查是否有未决行动。如果是,它将执行它。然后它要求AI玩家下一步行动 AI玩家将向AI线程发送动作请求,然后返回 最终,人工智能将提出一个行动,并

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

每个AI玩家都会有一个在独立线程上运行的AI

当世界在AI回合中更新时,它会检查是否有未决行动。如果是,它将执行它。然后它要求AI玩家下一步行动

AI玩家将向AI线程发送动作请求,然后返回

最终,人工智能将提出一个行动,并将其发回世界,世界将在下一次更新中看到它

两个问题:

1) 这个设计听起来好吗


2) 如何处理与AI线程之间的通信?如果我让AI线程调用world.queueAction(action),这似乎可以工作,但是如果渲染线程调用AI.chooseAction(world),它将在渲染线程上运行action Selecting,这不是我想要的

我将为AIs提供Executor服务,并为其添加任务,以完成您希望它执行的任务。对于UI,您可以拥有一个已更改且可能需要重新绘制的内容队列。我很想对所有AI使用一个线程,直到您知道这会有所帮助。大多数Android设备都只有1-2个CPU。

如果我理解正确:

  • 您有一个渲染线程。这大概是以显示帧速率运行的
  • 你有一条“世界逻辑”的线索。这是从某个可预测的计时器运行的。
    • 在一个线程中有普通物理、玩家输入或其他操作
    • 每个AI角色都有一个单独的线程

似乎您可以安全地将每个AI逻辑线程作为
未来运行
,并在每个帧上执行“世界”线程正在执行的任何其他操作后,一起获取它们的结果

您确定系统能够处理大量线程吗?请记住,运行线程的“最佳”数量通常是
n+1
,其中
n
是系统拥有的内核数量。如果这是运行在手机上,将有较少的这些可用的,虽然除非你运行超过10你可能会很好

对于你的游戏和你的AI之间的连接,考虑到(人)玩家和AIs之间的差异可能是有帮助的:只有一个重要的区别——一个是计算机,另一个不是。最好将AI采取的行动提交到与人类玩家完全相同的队列(或通过相同的通用机制)(因此,调用
world.queueAction(action);
)。这也使得AIs和人类玩家之间的交换变得更简单,因为你的世界更新代码不需要知道它们之间的区别


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

渲染线程中没有执行世界逻辑,是吗?实际上是这样的:Android UI线程(注册用户触摸和其他事件)、渲染线程(绘制屏幕并更新世界逻辑,以帧速率运行)。因此,世界更新没有常规的“时钟滴答声”。也许应该有?那么,假设这是一个屏幕外渲染缓冲区或什么的?所有的UI更新不都必须在安卓上的一个线程中发生吗?(它们在1.5中发生过,但我知道,我已经过时了…)它有一个循环,用于更新世界逻辑,将世界渲染到缓冲区中,然后锁定画布,渲染缓冲区,解锁画布,然后返回顶部。有趣的是,我不知道现在可以这样做。不过,我害怕将世界逻辑与渲染绑定。我建议保留世界逻辑和渲染的计时器ng管道尽可能分开,这样显示速度减慢不会使字符移动变慢。而且,正如X-Zero指出的,您不太可能有多个CPU,因此使用多个分开的线程可能过于复杂。好吧,AI类将实现Runnable及其run()方法将根据当前级别状态计算下一步移动,然后将新操作排入队列。AIPlayer将有一个静态ExecutorService。当对AIPlayer对象调用chooseAction()时,它将使用当前级别状态更新其AI实例,然后通知执行者服务运行其AI实例。