我正在用 Java (在 Android 框架中) 开发一款回合制策略游戏。按照《Beginning Android Games》中的结构,我有一个渲染线程和一个 UI 线程。 渲染线程重复更新世界状态,然后重绘世界。 当用户与屏幕交互时,GUI 将 Actions 发送到世界(命令模式)。 现在我正在添加 AI 玩家,这是我的计划:
每个 AI 玩家都将拥有一个在单独线程上运行的 AI。
当世界在 AI 回合更新时,它会检查是否有待处理的动作。 如果有,则执行它。 然后它会向 AI 玩家询问它的下一个动作。
AI 玩家会将动作请求发送到 AI 线程,然后返回。
最终,AI 会想出一个动作,并将其发回给世界,世界会在下次更新时看到它。
两个问题:
1) 这种设计看起来合理吗?
2) 如何处理与 AI 线程的来回通信? 如果我让 AI 线程调用 world.queueAction(action),这似乎可行,但如果渲染线程调用 ai.chooseAction(world),这将在渲染线程上运行动作选择,这不是我想要的。
回答:
我会为 AI 准备一个 ExecutorService,并向其中添加你希望它执行的任务。 对于 UI,你可以拥有一个已更改并可能需要重新绘制的事物队列。 我会倾向于为所有 AI 使用单个线程,直到你确定这样做会有所帮助。 大多数 Android 设备只有 1-2 个 CPU。