【问题标题】:System.Threading.Timer freezing computerSystem.Threading.Timer 冻结计算机
【发布时间】: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(),它完美无缺地按预期工作,所以我真的不知道问题出在哪里。

我的问题是:

  1. 是什么导致我的计算机锁定到必须按住电源按钮的程度。
  2. 除了 System.Threading.Timer 之外,我还有什么可以使用的东西,它可以在不完全杀死我的计算机的情况下给我想要的结果? (由于它是一款 MMO 游戏,并且可能需要对数百个敌人进行寻路更新,因此能够一次运行此功能最多约 20 次)。

谢谢!

【问题讨论】:

  • 如果没有看到getNewPath 中的代码,可能很难回答。计时器不太可能减慢计算机速度,getNewPath 中的代码很可能是。
  • @hatchet,这是一个简单的 A* 寻路算法
  • 虽然我不明白为什么代码中的内容会大大降低我的计算机速度。无论如何都应该花费 100 毫秒,不是吗?
  • 另外,你确定你没有创建一堆这样的计时器并且从不关闭它们吗?

标签: c# performance crash


【解决方案1】:

如果不知道 getNewPath() 中的代码,甚至无法猜测原因。而且很难相信这只是一个简单的 A* 寻路算法

这里有几点开始调查

  1. 停止前的 CPU 使用率是多少?它发生时的速率是多少?哪个进程的速率最高?
  2. 磁盘、网络、内存使用率是多少?
  3. 除了上述之外,getNewPath 是否会消耗其他资源?
  4. 您可以打印 5 条消息。但是它们是在 getNewPath 之前/内部/之后打印的吗
  5. 您有 getNewPath 的源代码吗?能否修改 getNewPath 中的代码?
  6. getNewPath 线程安全吗?它会创建更多线程吗?

可能还有更多的东西要看。但这些应该足以让你开始。任何人都需要它们来提供意义建议。

【讨论】:

  • 这是对这个特定问题的回答还是关于如何调试的一般回答?我在那里也看到了很多问题,更适合作为 comment
猜你喜欢
  • 2019-11-16
  • 2017-02-14
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
相关资源
最近更新 更多