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

时间:2017-01-20 17:03:15

标签: memory optimization unity3d profiling

我在运行游戏时看了一下剖析器,我可以在那里观看一大堆东西 - 但不是我的脚本的内存使用情况。事实上,我的游戏的总内存分配是223 MB,但纹理只有112个,除了那个我看到的一两个MB。我不知道我的其他100 MB内存去了哪里,我想稍微优化我的脚本。附注:我使用Visual Studio进行编码。也许我应该看看那里?

1 个答案:

答案 0 :(得分:4)

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

GC ALLOC

在Unity Profiler窗口的CPU Usage视图中,您可以看到脚本在任何给定帧中分配了多少内存。这显示在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桌面PC进行开发,可以使用System.GC.GetTotalMemory(...)向系统询问它认为为您的应用分配的内存量。它报告的实际数字可能不是您感兴趣的,但如果您在应用程序的不同位置调用此函数,则可以看到总内存使用量何时增加。例如,您可以在大块初始化之前调用GetTotalMemory,然后在初始化结束时再次调用#standardSQL SELECT DATE_TRUNC(CURRENT_DATE(), YEAR) as YEAR 。比较这两个数字可以估算出你的记忆增长*

*它可能不完全准确,因为在后台进行的进程,如GC,可能会影响这个数字

有关详细信息,请参阅此处:https://msdn.microsoft.com/en-us/library/system.gc(v=vs.110).aspx

希望其中一些有帮助!!