一.代码层面。
1.foreach。
Mono下的foreach使用需谨慎。频繁调用容易触及堆上限,导致GC过早触发,出现卡顿现象。
特别注意的是在Update中如果非必要,不要使用foreach。尽可能用for来代替foreach。会产生GC Alloc,说明foreach调用GetEnumerator()时候有堆内存上的操作,new和dispose。
2.string修改。
如果熟悉C++的话,就会了解,每次使用string的时候,都要在内存中创建一个新的字符串对象,就需要为该新对象分配新的空间。 特别是在循环中需要修改string对象,就会频繁的分配新的空间,这时候推荐使用StringBuilder.Append等操作来处理。C++中通常也是通过分配一个固定的字符内存来处理字符串的操作。
3.gameObject.tag
gameObject.tag 会在内部循环调用对象分配的标签属性以及拷贝额外的内存,推荐使用gameObject.CompareTag("XXX")来代替.tag。
4.使用ObjectPool对象池来管理对象,避免频繁的Instance,Destroy。
二.贴图层面。
代码上的内存优化,很大层面上都不及贴图上的优化。有时候改一张图就帮你省了大几兆的内存。
1.巧妙通过调整纹理资源,来调整图的大小。比如:通过9宫格、部分缩小后Unity里在拉大等方式。
比如:(主要调整了两个小元素)就省了一半的内存。
优化前:
优化后:
2.Ios平台使用PVRT压缩纹理。Adroid平台使用ETC1格式压缩。均可以减至1/4的内