---恢复内容开始---正则表达式
Unity的mono虚拟机占用的是堆内存,应该也是使用了内存池之类的机制,释放掉对象,堆内存是不会被释放的。因此要管理好堆内存,省得堆内存暴涨首先就把手机撑爆了。缓存
首当其冲的是内存泄露,无用的资源始终占据着内存,须要用的时候又初始化实例,致使内存没法释放,占用的内存持续升高。闭包
其次,高频率的实例化对象又释放对象,会看到GC一直很高。高GC会占用大量的CPU资源,致使游戏卡顿。spa
我会整理记录遇到的一些容易被忽视的,或者隐藏较深的问题。3d
1.Debug.Log会在各类模式下运行,虽然不会真的打印出来。当前的解决方案是,多封装了一层,用宏来控制只调用空方法体。code
2.另一个广泛的协程的错误是使用了new 当yield同一个值屡次,会形成高频gc,而且高CPU消耗。当前的解决方案是,循环体的话,先实例化一个waitforseconds对象,而后yield之。协程
此外,咱们本身写了一个单例Timer类(使用OnUpdate进行realTime计时,单次计时,屡次触发,用委托将callback接口暴露出来。模仿LUA里面的Timer类),用于实现定时刷新。对象
3.频繁触发的方法,里面的实例化也应该作缓存。(好比消息体里面的memorystream之类)blog
4.方法的引用,不管是匿名方法仍是命名方法,在Unity里面都是引用类型,都将会致使堆内存的分配,将匿名方法转变为闭包(匿名方法使用了在建立的时刻的局部变量的地方),会显著的增长内存的使用和堆内存的分配。so,委托的匿名写法: callback += () =>{//body} 的写法,若是要重复调用的,会形成GC,若是用了局部变量,还要形成额外的堆内存分配和使用,耍酷的同时是要付出代价的。接口
5.这个梗其实比较常识了。不过仍是顺带说一下。LINQ和正则表达式会有装箱和拆箱操做,所以要尽可能避免使用。当前项目中是禁止使用LINQ和正则的。
//date to 2016-11-29