【发布时间】:2018-02-04 10:10:57
【问题描述】:
我正在创建一个类似于 tic tac toe 的棋盘游戏,并且我已经创建了一个 AI 来玩该游戏。 AI 是 CPU 密集型的,所以我决定把它放在它自己的线程上。我正在使用这个插件来做多线程:https://www.assetstore.unity3d.com/en/#!/content/15717。
我有这个 IEnumerator:
static IEnumerator executeAITurn(Turn turn) {
Vector2[] move = mctsManager.mcts(new State(sections, null, turn), AIIterations)[0, 0].metaData.lastMove;
yield return Ninja.JumpToUnity;
input(move, true);
yield return Ninja.JumpBack;
Debug.Log("DONE!");
}
我使用它运行它
gameManager.StartCoroutineAsync(executeAITurn((AITurn == Turn.X) ? Turn.O : Turn.X));
通常,当我运行 executeAITurn 时,它可以正常工作,但由于某种原因,有时当我运行它时,它会执行应有的操作,但在任务管理器中,我的内存刚刚开始以 30 mb / 秒的速度增加。内存一直增加到 1000 mb,游戏变得非常慢。当我关闭播放模式时,内存有时会继续增加或停止在原来的位置。我必须通过任务管理器结束 Unity 以释放内存。
我尝试过的一件事是用常规 for 循环替换 foreach 循环,这似乎有所帮助。内存增加的速度下降了很多(最初它会以大约 100 mb / sec 的速度增加)。
任何帮助将不胜感激。
下面是executeAITurn涉及的部分代码:
mctsManager 类:https://pastebin.com/yzeHrY2p
【问题讨论】:
-
你试过调试它吗? Unity 有一个内置的分析器。
-
我刚刚检查了分析器,大部分内存似乎来自 ManagedHeap.UsedSize (424.9 MB)、System.ExecutableAndDlls (301.0 MB) 和 ManagedHeap.ReservedUnusedSize (163.1 MB)。我不确定我应该如何处理这些信息。 reservedUnusedSize 应该这么高吗?
-
有没有尝试联系多线程插件的作者?
-
@DavidOliver 我没有。我现在试试
-
您的 generateMoves 函数正在递归调用自身。您可能想要跟踪您在递归中的深度,并在遇到一些您不期望的大数字时退出控制台。
标签: c# multithreading unity3d memory-leaks