我正在用Java开发一个基于回合的策略游戏(在Android框架中)。按照开始Android游戏中的结构,我有一个渲染线程和一个UI线程。渲染线程重复更新世界状态,然后重新绘制世界。当用户与屏幕交互时,GUI向世界发送操作(命令模式)。现在我正在添加AI玩家,这是我的计划:
每个AI播放器都有一个运行在单独线程上的AI。
当世界在AI转弯时更新时,它会检查是否有挂起的操作。如果是这样,它就会执行它。然后,它要求AI播放器进行下一步操作。
AI播放器将向AI线程发送操作请求,然后返回。
最终,AI将提出一个动作,并将其发布回World,后者将在下一次更新中看到它。
两个问题:
1)这种设计看起来合理吗?
2)如何处理AI线程之间的通信?如果我让AI线程调用world.queueAction( action ),这似乎可以工作,但是如果render线程调用ai.chooseAction(world),它将在render线程上运行操作选择,这不是我想要的。
发布于 2011-12-10 01:10:09
我会有一个AIs的ExecutorService,并为你想要它执行的事情向它添加任务。对于UI,您可以拥有一个已更改且可能需要重新绘制的事物的队列。我很想为所有的人工智能使用一个线程,直到你知道这会有帮助。无论如何,大多数Android设备只有1-2个CPU。
发布于 2011-12-10 01:30:16
您确定系统将能够处理大量线程吗?请记住,正在运行的线程的“最佳”数量通常是n + 1,其中n是系统拥有的核心数量。如果这是在手机上运行的,那么可用的将会更少,尽管除非你运行超过10个,否则你可能会很好……
对于你的游戏和AI之间的联系,考虑(人类)玩家和AI之间的区别可能会有所帮助:只有一个重要的区别-一个是计算机,另一个不是。最好将AI采取的操作提交到与人类玩家完全相同的队列(或通过相同的通用机制)(因此,调用world.queueAction(action);)。这也使得人工智能和人类玩家之间的交换变得更简单,因为你的世界更新代码不需要知道区别……
我假设你已经有了某种事件来通知玩家/在轮到人类玩家时更新屏幕。对AI线程做完全相同的事情-让它监听适当的“轮到你了”事件,导致它完成(这个迭代)计算并将一个操作放在队列上。请注意,这需要从“world update”线程完成;渲染线程应该只关注将输出渲染到屏幕上(并且只关注播放器输入)。
发布于 2011-12-10 01:11:45
如果我理解正确的话:
都有
似乎您可以安全地将每个AI逻辑线程作为Future运行,并在每个帧上执行"world“线程正在执行的其他操作后一起获取它们的结果。
https://stackoverflow.com/questions/8449059
复制相似问题