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没释放
使用如下函数来查看本机堆和托管堆的内存信息
其中托管堆在ios上是无法打印的,但是可以使用下面函数来逼近
在lua中,使用如下代码来打印lua中的gc内存
参考文章地址
http://blog.csdn.net/liqing2060/article/details/45401959 https://www.zhihu.com/question/26779558
不要直接用==比较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
相关文章推荐
- Unity3D设置纹理格式
- 在Unity中使用Lua脚本:语言层和游戏逻辑粘合层处理
- Unity3d碰撞检测中碰撞器与触发器的区别
- Android与Unity相互调用
- 【Unity3D实战】零基础一步一步教你制作酷跑类游戏(1)
- 在unity编辑器中给Hierarchy列表中的GameObject加icon
- Unity3d 脚本开发代码规范
- Unity3d 协程、调用函数、委托
- Unity3d摄像机Camera参数详解
- Unity3d多线程
- 猫都能学会的Unity3D Shader入门指南(一)
- iTween基础之Move(移动)
- iTween基础之功能简介
- Unity3d + UGUI 的多分辨率适配
- iTween基础之Scale(缩放大小)
- Unity3D For Mac最新3.4.1版本破解教程分享并将Unity3D项目在iphone上运行
- Unity3d读取.csv文件
- Unity3d之UGUI- Image拦截Button响应事件
- iTween基础之Rotate(旋转角度)
- Unity3d本地存储