首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我应该如何处理AI线程和主游戏循环之间的通信?

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

Stack Overflow用户
提问于 2011-12-10 01:05:25
回答 3查看 1.1K关注 0票数 5

我正在用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线程上运行操作选择,这不是我想要的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-10 01:10:09

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

票数 4
EN

Stack Overflow用户

发布于 2011-12-10 01:30:16

您确定系统将能够处理大量线程吗?请记住,正在运行的线程的“最佳”数量通常是n + 1,其中n是系统拥有的核心数量。如果这是在手机上运行的,那么可用的将会更少,尽管除非你运行超过10个,否则你可能会很好……

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

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

票数 2
EN

Stack Overflow用户

发布于 2011-12-10 01:11:45

如果我理解正确的话:

  • 你有一个渲染线程。想必,这个运行在frame-rate.
  • You上的显示有一个“世界逻辑”线程。它从某个可预测的定时器运行。
    • 您可以在一个线程中执行一般的物理操作、玩家输入或其他操作;每个AI character

都有

  • 和一个单独的线程

似乎您可以安全地将每个AI逻辑线程作为Future运行,并在每个帧上执行"world“线程正在执行的其他操作后一起获取它们的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8449059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档