我正在研究基于回合制的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)将在渲染线程上运行选择操作,这不是我想要的。
答案 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逻辑线程作为Future
运行,然后在做了其他任何事情之后一起拿起他们的结果" world"线程正在做,每帧。