内存
使用Profiler可以查看某个资源的内存占用情况,但是必须启动游戏,并且待查看的资源已经载入游戏中。我希望的是不启动游戏,也能看到它的内存好做统计。
硬盘
由于unity中的资源压缩格式记录在meta中所以,在文件夹中看到的资源大小是不正确的。打开unity需要选择一个资源,比如Texture、然后在右侧Inspector面板最下面可以看见它真实的硬盘占用。这个数据我也希望那个可以脚本取到,这样我好做统计工具。
在Project视图中先选择一个Texture 然后点击menuitem (“1/1”)即可
1 2 3 4 5 6 7 8 9 10 11 12 |
[MenuItem("1/1")] public static void menu() { Texture target = Selection.activeObject as Texture; var type = Types.GetType ("UnityEditor.TextureUtil", "UnityEditor.dll"); MethodInfo methodInfo = type.GetMethod ("GetStorageMemorySize", BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public); Debug.Log("内存占用:"+EditorUtility.FormatBytes(Profiler.GetRuntimeMemorySize(Selection.activeObject))); Debug.Log("硬盘占用:"+EditorUtility.FormatBytes((int)methodInfo.Invoke(null,new object[]{target}))); } |
内存的话unity提供了API Profiler.GetRuntimMemorySize。
硬盘的话unity没有提供,我查看了它的源码需要通过反射可以获取到。如果你还想查看别的资源的硬盘占用,自行查看一下他editor下的代码,用上面这样的代码反射获取出来即可。
- 本文固定链接: https://www.xuanyusong.com/archives/4263
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!
在高版本的Unity下,Types.GetType改为程序集获取方式(Assembly.Load(…).GetType(…))。然后GetStorageMemorySize类似这种函数,在高版本下后边都会增加Long标记。所以Method获取时,正确的函数名:GetStorageMemorySizeLong。
我这边用的是2022.2.1f1c1,在HDRP环境下编写Editor工具时验证。
您好,Types.GetType 在unity5.5废弃了,没有找到替换的接口,请问这个怎么解决呢
用System.Reflection.Assembly.Load(assemblyName).GetType(typeName)作为替换
测试一下新的评论框。
我的天啊,我好想做一个2D的翻书页效果,类似iBook那种。哥,能给个思路吗
网上有个插件专门搞这个的, 但是效率不高。。
这个函数不是非常的准确,有的时候会比实际运行时要大。
这是unity Profiler里的值 实际值跟平台有关系吧。
你好,请问为什么获取到运行时的内存是在磁盘上占用大小的两倍?
估计是Texture的Import属性里将Read/Write Enabled设置为true了。
在editor下面运行一般是2倍的大小,在具体的运行平台上就可以看到正确的值了。