Unity 分析我的脚本的内存使用情况

Posted

技术标签:

【中文标题】Unity 分析我的脚本的内存使用情况【英文标题】:Unity profiling my scripts' memory usage 【发布时间】:2017-01-20 17:03:15 【问题描述】:

我在运行我的游戏时查看了分析器,我可以在那里看到一大堆东西 - 但不能看到我的脚本的内存使用情况。问题是,我的游戏的总内存分配为 223 MB,但纹理只有 112 个,除此之外我看到的只有 1 或 2 MB。我不知道我的其他 100 MB 内存去了哪里,我想稍微优化一下我的脚本。旁注:我使用 Visual Studio 进行编码。也许我应该看看那里?

【问题讨论】:

【参考方案1】:

以下是我从使用 Unity 发布应用程序中学到的一些内存分析技巧。

GC 分配

在 Unity Profiler 窗口的 CPU 使用情况视图中,您可以查看脚本在任何给定帧中分配了多少内存。这显示在 GC Alloc(垃圾回收分配)列中。

这不会为您提供单个脚本的总内存使用量,但它对于提高性能和内存消耗非常有用。如果您的脚本分配每一帧,内存将继续累积,直到垃圾收集器被触发。这种积累会增加您的内存占用,并且运行 GC 会导致性能下降。

查看这里了解更多信息:https://docs.unity3d.com/Manual/ProfilerCPU.html

内存视图

Unity Profiler 窗口的详细内存视图会告诉您游戏中加载的任何内容(包括大量内置资产)的内存使用情况。这将让您确定哪些纹理、网格或其他资产过大。当您在此视图中查看资产时,它会告诉您它在场景中的引用位置,这可以帮助您确定哪些游戏对象可能使用了过多的内存。

此视图的一个问题是许多资产显示为空白,因为它们没有名称。当您在脚本中创建资产(纹理、网格等)时会发生这种情况。您可以通过设置您创建的任何资产的.name 属性来更改此设置。这将显示在内存分析器窗口中。

查看这里了解更多信息:https://docs.unity3d.com/Manual/ProfilerMemory.html

构建报告

执行构建(独立版、Windows 应用商店等)后,编辑器日志中会生成构建报告。它可能很难找到,但它提供了很多有用的信息,说明哪些资产会影响您的构建大小。要记住的一件事是,此报告使用未压缩资产大小,因此许多类型的资产(尤其是纹理)实际上最终会比此处显示的要小。在控制台窗口的右上角,有一个用于打开编辑器日志的下拉菜单。您感兴趣的部分将如下所示:

Textures      0.0 kb     0.0% 
Meshes        0.0 kb     0.0% 
Animations    0.0 kb     0.0% 
Sounds        0.0 kb     0.0% 
Shaders       18.6 kb    0.4% 
Other Assets  0.7 kb     0.0% 
Levels        5.2 kb     0.1% 
Scripts       460.8 kb   10.2% 
Included DLLs 3.9 mb     89.1% 
File headers  8.4 kb     0.2% 
Complete size 4.4 mb     100.0% 

Used Assets and files from the Resources folder, sorted by uncompressed size:
18.9 kb  0.4% Resources/unity_builtin_extra
4.0 kb   0.1% ...UnityEngine.UI.dll
1.8 kb   0.0% ...UnityEngine.Networking.dll
0.1 kb   0.0% ...UnityEngine.Advertisements.dll
0.1 kb   0.0% ...UnityEngine.Purchasing.dll
0.1 kb   0.0% Assets/TestClass.cs
0.1 kb   0.0% Assets/MemoryTester.cs
0.1 kb   0.0% Assets/Rotator.cs

对于懒人,资产商店中有一个 Unity 插件可以为您解析:https://www.assetstore.unity3d.com/en/#!/content/8162

(我既没有使用过这个插件,也没有认可它的使用)

System.GC.GetTotalMemory

​​>

如果您在 Windows 台式电脑上进行开发,您可以使用 System.GC.GetTotalMemory(...) 向系统询问它认为为您的应用分配的内存量。它报告的实际数字可能对您不感兴趣,但如果您在应用程序的不同位置调用此函数,您可以看到总内存使用量何时上升。例如,您可以在大块初始化之前调用GetTotalMemory,然后在初始化结束时再次调用。比较这两个数字可以估计你的记忆增长了多少*

*它可能并不完全准确,因为后台有进程(例如 GC)会影响这个数字

查看这里了解更多信息:https://msdn.microsoft.com/en-us/library/system.gc(v=vs.110).aspx

希望对你有所帮助!!

【讨论】:

这很有帮助,谢谢。还有两个:Visual Studio 呢?比如说,控制台应用程序我可以看到我在做什么,但是如何利用 Unity 应用程序的这种能力呢?还有一件事,如何关闭一些我不使用的 Unity 功能?这会提升游戏的性能吗? @agiro - (Q1) 如果您制作游戏的 Windows 应用商店版本并打开生成的 VS 项目,您可以运行性能分析器(调试 > 性能分析器)。这为您提供了应用程序总内存使用情况的图表,但(至少据我所知)并没有为您提供任何更深入的信息。我当然不是 Visual Studio 专家。在我不知道的 VS 中可能有更好的分析方法。 (Q2) 实际上没有办法禁用未使用的 Unity 功能。不过,您可以做的一件事是调整图形设置(编辑 > 项目设置 > 图形或质量) @agiro - Unity 有很多关于优化的好资源。这里有几个:Graphics Optimization、Scripting Optinization、Mobile Optimization、Reducing File Size @agiro - 对于真正密集的分析,Windows 10 SDK 附带了一组很棒的高级分析器。看看 GPUView 和 Windows 性能分析器。它们当然不适合胆小的人,但是当您遇到一些非常神秘的性能问题时,它们会很有用。虽然我肯定会建议先从内置的 Unity 工具开始。 感谢您的意见。我一定会去看看的。

以上是关于Unity 分析我的脚本的内存使用情况的主要内容,如果未能解决你的问题,请参考以下文章

分享一个辅助分析内存泄漏的脚本

Unity内存泄漏危害及处理方式(腾讯WeTest分析使用)

《Unity》性能分析工具和调试工具及方法

调试 - 如何分析反应本机内存使用情况

为 Rails 项目的一部分配置内存性能

Unity:在我的函数中分配内存的是啥?