c# - 我怎样才能找出是什么在制造垃圾?

标签 c# mono garbage-collection unity3d

<分区>

这是一个非常普遍的基于学习的问题,而不是技术问题。

我正在使用 Unity 制作游戏。游戏涉及很多非常复杂的高对象数过程,因此,我产生了很多垃圾。制作使用托管代码的游戏的每个人都知道,垃圾收集峰值是一个巨大的嗡嗡声。我也在尝试以移动设备为目标,因此这种痛苦被放大了。

我的目标很简单:追踪产生最多垃圾的过程并池化并重用所涉及的对象,以减少垃圾收集器的负载。我已经解决了所有明显的类,但我的 GC 问题仍然存在。如果有人可以在这里提供一些更大的智慧,请提出来。

在我的研究中我一直无法追踪到的是衡量 GC 负载和追踪代码本身问题点的好方法。我可以从 Unity 和诊断类中获取有关内存池大小的指标(尽管我不是这些数字的真正含义的专家)并且我可以显示自开始以来发生的 GC 收集总数,但我对调试这个问题的了解到此为止。

我知道一定有更好的方法来解决这个问题。谁能指出可以帮助我解决问题的正确工具或框架类(或库?)?我看到有人提到调试器程序 (sgen?),它是 Mono 的一部分,但我找不到下载,更不用说如何将其连接到 Unity 游戏的指南了。

如有任何帮助,我们将不胜感激。谢谢。

最佳答案

特别是对于 C# 和 Unity3D,Unity3D 中内置的探查器是您可以使用的最佳工具。您应该能够使用 Unity Profiler 走得更远。特别是 CPU Profiler :

enter image description here

我突出显示了最重要的列 - GC Alloc - 它逐帧显示已分配给垃圾回收的内存。此处游戏的目的是使该列尽可能始终接近零。

我建议在那里花几个小时,玩你的游戏,暂停它并深入研究代码中 GC Alloc 显示数字的区域。

最后,我强烈建议您查看 this Unity 开发人员之一关于内存调试和正确使用 Unity Editor 分析器的视频教程。

关于c# - 我怎样才能找出是什么在制造垃圾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20413333/

相关文章:

c# - 为什么 EF Core 一对多关系集合返回 null?

f# - 如何在 Mac OS 上为 fsharpc 设置包路径

powershell - PowerShell 管道正在执行时没有垃圾收集

java - 发布类加载器引用失败

c# - 了解 C# 泛型和 Nullable 值类型。返回 null 或 nullable

haskell - Haskell 运行时统计中的负生产力

c# - Entity Framework 从插入中排除字段

c# - 如何在树状结构中列出程序集(包括引用的程序集)中的所有属性?

c# - Collection<T> 不包含 ICollection 接口(interface)的所有属性

c# - SQLCLR:如何将程序集 Npgsql.dll 添加到数据库?