【发布时间】:2015-11-15 01:43:52
【问题描述】:
我正在制作一个带有 AI 的 Unity3D 国际象棋游戏。
我的游戏画面在 AI 正在寻找一个好的动作时卡住了。
一般来说,AI 思考大约需要 5~30 秒。
我知道那是因为我的 CPU 资源专门用于计算 AI。
但是我打开任务管理器,发现我的游戏只占用了50%的CPU,可能是因为我的电脑是intel core 2,有2个线程。
所以我的想法是:
Unity(或 C#)是否可以在一个线程中进行 AI 计算,并在另一个线程中保存游戏玩法?
所以玩家在 AI 计算时不会看到卡住的屏幕。
听说过Delegate或Event,但还是不知道多线程之间的关系。
【问题讨论】:
-
您的用例非常适合多线程(棘手的一点是 Unity 对象无法在线程之间轻松共享,但您可以使用自定义 C# 对象传递您的 AI 查询和结果).. 只需 google C#多线程,你应该能找到比“Delegate or Event”更多的东西。在这里提出任何具体的问题。
-
感谢您的回复,@Paul-Jan。那么这是否意味着我不能在我的 AI 中使用任何 Unity API,因为它们在不同的线程中?所以我不能使用 GetComponent 之类的方法,也不能读取类从 MonoBehaviour 继承的任何变量,对吗?
-
没错,直接将这些值传递给AI线程(如果有很多,写一个特定的对象来包含它们,或者使用字典),当线程完成时,回读处理的主统一线程中的值并将它们分配给适当的游戏对象属性(或生成对象,或任何 AI 处理的结果)。
-
我知道了,但现在的问题是 AI 需要做“假动作”(或称为尝试/搜索),而假动作方法写在主要游戏代码中,并且确定它调用统一 api,它不是一个简单的国际象棋游戏,所以“移动”包含大量情况和各种数据。我不能自己复制它,而只是拉出所有统一 API 用法。以后也很难维护。我会继续考虑的。谢谢你的帮助!保罗。
标签: c# multithreading unity3d delegates artificial-intelligence