有没有办法从 Unity3d 获得一个重要信息?

Posted

技术标签:

【中文标题】有没有办法从 Unity3d 获得一个重要信息?【英文标题】:Is there a way to get a heapshot from Unity3d? 【发布时间】:2015-07-23 04:10:35 【问题描述】:

我想调试在 Unity 中消耗大部分单声道内存的部分,因为我从分析器中看到的只是一个块,上面写着“单声道”类似的东西,不知道它是什么。

我已经在 Unity profiler 中完成了纹理观察,我对此没有任何问题。 (我说我用过它,只看到高内存的单块)问题是一定有某种内存泄漏而不是内存尖峰,因为如果我玩游戏的时间足够长,我的 Galaxy Grand Duo 会崩溃并出现黑色纹理,这是内存使用过多。如果我在分析器中看到它,它说 ManagedHeap 和 Mono Domain 仅在玩了多次游戏后才具有大块内存。

【问题讨论】:

【参考方案1】:

有关您正在为哪个平台开发、您已经在使用哪些工具以及您开始分析内存的原因的更多信息会很有帮助。如果没有这些信息,我只能提出以下建议......

1) Unity 内存分析器

我建议从 Unity3D 编辑器中包含的内存分析工具开始。您可以在此处了解有关这些工具的更多信息:http://docs.unity3d.com/Manual/ProfilerMemory.html

听起来你已经在这样做了,因为你已经从探查器中缩小了“单声道”项目的范围。这很好,您现在知道这是您的脚本之一正在消耗内存。

确保您使用的是高级视图。 Unity Profiler 的高级视图将为您提供有关哪些脚本正在使用您的内存的更多信息。

2) 纹理

谈到 Unity 和内存时,我总是从纹理开始。似乎每次我对纹理进行动态加载或修改时都会造成内存泄漏。查看您的脚本,尤其是任何加载纹理的脚本,并尝试暂时禁用此逻辑。它对你的记忆问题有帮助吗?

3) 观察和优化

如果您无法找到任何可能导致问题的脚本,我会尝试观察您的游戏并找到您看到内存峰值的点。尝试确定此时正在运行的逻辑。禁用单个脚本并再次运行您的场景。这是否减少了内存使用量?重复此过程,直到找到导致您的峰值的一个或多个脚本。找到这些脚本后,您可以尝试重构它们,直到获得所需的结果。

【讨论】:

我已经在 Unity profiler 中完成了纹理观察,我对此没有任何问题。 (我说我用过它,只看到高内存的单块)问题是一定有某种内存泄漏而不是内存尖峰,因为如果我玩游戏的时间足够长,我的 Galaxy Grand Duo 会崩溃并出现黑色纹理,这是内存使用过多。如果我在分析器中看到它,它会说 ManagedHeap 和 Mono Domain 仅在多次玩游戏后才具有大块内存。 您是否已将分析器切换到高级模式?看看这个截图:docs.unity3d.com/uploads/Main/ProfilerMemoryDetailed.png 是的,我已经这样做了,我看到该部件使用了单声道内存。内存使用过多的示例是循环中的字符串连接。这将触发动态内存使用以每次创建一个新块。我想要的是指定哪些代码具有那种泄漏内存的东西,或者可能还有其他泄漏内存的情况。 我认为这些信息应该足以让您通过查看脚本的功能来追踪代码。我能想到的唯一其他行动方案是创建应用程序的 Windows 版本并尝试附加许多 .NET 内存分析器之一,例如:red-gate.com/products/dotnet-development/ants-memory-profiler

以上是关于有没有办法从 Unity3d 获得一个重要信息?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法从facebook获得用户名。例如HI我是机器人

有没有办法通过 Keras 获得可变的重要性?

我可以从 IP 地址获得啥信息?

显示自定义排行榜 UI

Unity3D日常开发从物体当前方发射一条射线,并返回射线检测到的物体信息

Unity3D日常开发从物体当前方发射一条射线,并返回射线检测到的物体信息