- 1:Transform的子类型过多时避免频繁地进行Transform操作,大量的子物体会带来大量的操作。
- 2:避免频繁地Find、GetComponent。应该在Start时就获取;
- 3:避免创建大量不必要的碰撞盒。
- 4:使用gameObject.CompareTag(“XXX”)代替gameObject.tag,后者会产生额外的内存与性能消耗。
- 5:使用消耗更小的运算:例如1/5使用1*0.2来代替、用位运算代替简单乘除。(不过在性能并不是非常非常敏感的地方可以忽略位运算这一条,毕竟可读性还是要的。
- 6:使用内建的常量,例如Vector3.zero等等,避免频繁创建相同的对象。
- 7:自己可以写一个工具类,使用Update替代简单的协程,例如等待若干秒等等,可以消除创建协程的消耗。(这句给了我很大的启发;协程会增加内存的消耗,但是它的延时功能又很方便;))
- 8:String的相加操作,会频繁申请内存并释放,导致gc频繁,使用System.Text.StringBuilder代替
- 9:不要动态的产生字符串,如Debug.Log("boo" + "hoo"),尽量预先创建好这些字符串资源
- 10:使用对象池,不要频繁Instantiate 与Destroy;
- 11:真实的物理(刚体)很消耗,不要轻易使用,尽量使用自己的代码模仿假的物理
- 12:对于投射物不要使用真实物理的碰撞和刚体,用自己的代码处理;
代码内存上的优化:
-
- 1:在UI中使用池时考虑使用分级机制:在池中越不频繁出现的UI就应该更快地被销毁以释放内存,而频繁出现的UI则等待更长的时间。
- 2:使用延迟加载的方式,一些不常用的资源在第一次使用的时候再进行加载。
- 3:在使用池进行内存管理时特别要注意,当一个物体你不再需要的时候,请将其置为null。例如你封装了一个数组,其中装入了许多的对象,当你移除一个对象的时候或许并没有将其真正置空,而是移动了目前指向的位置,那么你本应移除的对象就泄漏了出去。
- 4:不要主动调用GC。而是通过良好的代码,即时去除不需要的对象的引用可以更好地让我们使用GC来回收垃圾。
- 5:AB优化内存,例如2D鱼机的BOSS图,都是比较占内存的,我们可以分开单独打包;BOSS出现的场景才加载这个场景的BOSS,其他的不要加载;过场景时,使用AssetBundle.Unload(true)删除这个AB的内存;然后加载下一个场景BOSS的AB;(BOSS都是直接生成,死亡时销毁的,因为BOSS比较难死,这点消耗比较小(主要还是方便,本来想写在对象池,但想了很久很难实现));
- 5:Resources加载如上:不过简单很多; 不需要用时,Destroy,Resources.Load的就变成游离资源了;
内存优化详细可以看这里:https://www.cnblogs.com/dudu580231/p/7160547.html
以上很多观点都是网上查到的,部分自己的理解;