您的位置:首页 > 移动开发 > Unity3D

Unity 4.6.x内存优化纪要

2016-02-22 12:28 543 查看
最近为了进行Unity内存优化,读了非常多的文章,现在暂时草草整理如下.

不要直接用==比较tag, 使用tag.CompareTo(otherTag) == 0, 可以避免生成多余的GC byte. todo:生成多少(180?)
避免使用foreach来遍历数组(还是一切范型?),使用for(;;)可以避免生成多余的GC byte
数据容器尽量使用Struct, 而不是Class
GetComponentInChildren实现为自己的无GC版本
string的拼接避免+, 使用text.StringBuilders来实现
对频繁的scope-bound的固定长度数组,尽量用成员变量数组来替代,进行重用, 只分配一次堆内存。或者使用struct代替。比如Vector3[4]变成Struct, 里面有4个Vector, 可以把数据全部分配到栈上.
尽量避免IEnumerable的方法
把类方法放入delegate或者Func<>会导致Boxed(装箱)
尽量重用new出来的类,而不是重复new. 建立对象池

----------------------------------------------

怀疑有object有泄漏,没有被gc的时候,可以尝试在class中的ctor和dtor, 及各种clone函数中加入自己的计数,在合适地方打印出该class静态count的数值,确定是否被释放。

使用Object.FindObjectsOfType(typeof(GameObject))来检查有多少GameObject没释放

使用如下函数来查看本机堆和托管堆的内存信息

unityTotalReservedMemory = (int)Profiler.GetTotalReservedMemory();
unityTotalAllocatedMem = (int)Profiler.GetTotalAllocatedMemory();
unityUnusedReservedMemory = (int)Profiler.GetTotalUnusedReservedMemory();
MonoHeapSize = (int)Profiler.GetMonoHeapSize();
MonoUsedHeapSize = (int)Profiler.GetMonoUsedSize();


其中托管堆在ios上是无法打印的,但是可以使用下面函数来逼近

(int)System.GC.GetTotalMemory(false);


在lua中,使用如下代码来打印lua中的gc内存

local c = collectgarbage("count")


参考文章地址
http://blog.csdn.net/liqing2060/article/details/45401959 https://www.zhihu.com/question/26779558
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: