【问题标题】:"Spike" profiler?“尖峰”分析器?
【发布时间】:2010-08-20 07:48:31
【问题描述】:

我正在编写一个游戏,虽然它的性能在大多数情况下都很好,但有时它会慢到爬行。普通分析器对此没有帮助,因为它们记录了我的游戏运行的整个时间,并且滞后部分中的重要信息在所有平滑部分中被稀释了。是否有任何工具或库可以帮助我隔离问题?

【问题讨论】:

  • 这可能是由于垃圾回收。您是否正在创建和释放大量对象?
  • 其实,我想我是。我实现了一个性能视图,发生的情况是我使用的内存会不断增加,并且每隔几秒左右就会减少几兆字节,并且随着时间的推移,基本内存消耗会迅速增加。

标签: .net profiling xna performance


【解决方案1】:

你几乎肯定会被垃圾收集击中。

是的,有一个工具可以解决这个问题。你想要CLR Profiler。这将准确显示您分配内存的位置。

在 Xbox 上,垃圾收集器将在每分配 1MB 后运行,而且速度很慢。 Windows GC 更宽容,但仍会导致帧率抖动。

避免垃圾收集卡顿的最佳方法是在游戏运行时不分配任何内容。在用户不会注意到的加载屏幕期间进行分配。

我建议阅读 Shawn Hargreaves 博客上的 this postthis post

【讨论】:

  • 好的,我从分析器获得了一些数据,我正在等待它加载,但与此同时,还有其他可用的分析器不会将我的游戏变成文字幻灯片吗?
  • 就其本质而言,分析会让您的游戏陷入困境。但即便如此,它也不会改变你的分配配置文件......所以你可以看到垃圾是在哪里创建的
  • @Joel:是的,但这不是“一点”:这是从(最多)60FPS 到每 3 秒左右 1 帧。很难控制以获得体面的运行。
  • 在我修复了 Texture2D 的持续创建后,我看到在 30 秒的运行中总共完成了 593 个对象,并且分析器说我的对象都没有被丢弃。我的问题也没有解决:/
  • @RCIX:最终确定的 593 个对象似乎非常高。但无论如何,这不是你想看的。您需要的按钮是Time Line。理想情况下,它会在您的游戏开始后趋于平稳。使用分配图(特别是通过“显示谁分配”)进一步缩小范围。另外:CLR Profiler 记录分配和 GC。如果您在游戏期间不进行分配,那么它对您的帧率影响应该很小。
【解决方案2】:

你说你从一个需要 16 毫秒的帧到 3000 毫秒。所以在很长的框架内,它花费 (3000 - 16)/3000 = 99.5% 的时间做你没有预料到的事情。

在这 3 秒内,您如何知道它在做什么?

暂停几次,然后检查调用堆栈。

不会在每次暂停时看到它在做什么的机会是 0.5%

如果它在垃圾收集器中,这应该确认它。如果它在做其他事情,它也会告诉你。

【讨论】:

  • 更准确地说,游戏会减慢到每秒 2-5 帧,但我的更新时间并没有显示出来。幻灯片(帧之间的几秒钟)仅在我对它进行内存分析时才显示。
  • @RCIX:不过,当它变慢时暂停它,你会发现问题。 (5fps = 12x 减速,所以每次暂停时捕捉到它的机会是 92%。)人们不习惯这个概念,但如果你尝试它会变得很自然。详细的原因在这里:stackoverflow.com/questions/1777556/alternatives-to-gprof/…
猜你喜欢
  • 2015-01-19
  • 2010-09-19
  • 1970-01-01
  • 2018-10-07
  • 2014-05-29
  • 1970-01-01
  • 2021-01-07
  • 2021-07-02
  • 1970-01-01
相关资源
最近更新 更多