【发布时间】:2017-03-27 23:44:25
【问题描述】:
我正在创建一个游戏,我有一个大约需要 100 毫秒的寻路功能。我有 5 个敌人,每个敌人在构造函数中都有这个函数:
newPath = new System.Threading.Timer((e) => {
getNewPath(); //The function that takes ~100 ms
}, null, 0, 5000);
现在,我在程序的早期使用 System.Threading.Timer(每 50 毫秒运行一次,仅用于步进函数,更新位置等)。那个工作正常,但如果我运行这个函数(别忘了我有 5 个敌人,所以它每 5 秒运行 5 次),我的整个计算机就会死机。现在我没有一台蹩脚的电脑(它不是最好的,但它对我的用途来说已经足够好了),所以我不知道问题出在哪里。即使所有计时器一个接一个地运行(它们不应该这样做,它们应该同时运行),最多应该花费 500 毫秒(或半秒),但它完全杀死了我的电脑,到了这一点在我的鼠标不动的地方,我不能按 Ctrl-Alt-Del,我只需要按住电源按钮直到它关闭。
我测试了用一个简单的打印函数代替 getNewPath(),它完美无缺地按预期工作,所以我真的不知道问题出在哪里。
我的问题是:
- 是什么导致我的计算机锁定到必须按住电源按钮的程度。
- 除了 System.Threading.Timer 之外,我还有什么可以使用的东西,它可以在不完全杀死我的计算机的情况下给我想要的结果? (由于它是一款 MMO 游戏,并且可能需要对数百个敌人进行寻路更新,因此能够一次运行此功能最多约 20 次)。
谢谢!
【问题讨论】:
-
如果没有看到getNewPath 中的代码,可能很难回答。计时器不太可能减慢计算机速度,getNewPath 中的代码很可能是。
-
@hatchet,这是一个简单的 A* 寻路算法
-
@hatchet pastebin.com/iF6f8eqi
-
虽然我不明白为什么代码中的内容会大大降低我的计算机速度。无论如何都应该花费 100 毫秒,不是吗?
-
另外,你确定你没有创建一堆这样的计时器并且从不关闭它们吗?
标签: c# performance crash