Unity游戏开发性能优化篇
MonoBehaviour
可以写一个基类继承自MonoBehaviour,然后所有的UI脚本继承自该基类,保证游戏中尽量较少的脚本继承自MonoBehaviour,所有的Update执行的时候,都使用基类从MonoBehaviour继承下来的Update函数。不要各自继承使用。总之一句话,继承自MonoBehaviour的脚本数量越少越好,最好就一份。
获取组件
UI脚本上面的变量尽量通过序列化方式赋值,不要用GetComponent或者Fnd函数,可以编写编辑器函数设置,在游戏运行中不要动态获取。
相机
Camera一般有两个,UI相机和场景相机都需要缓存起来使用,不要代码中动态获取。
反射
不要在代码中使用反射。
foreach和for
使用for代替foreach
删除操作
不要在foreach里面做删除操作,因为迭代器会失效,导致错误。List使用for删除的时候,从尾部删除。
字符串
使用StringBbuilder代替string的Concat和Format操作。最好自己封装一个公共的StringBbuilder。
对象池ObjectPool
为了避免频繁的创建和删除,要使用ObjectPool对象池。
Text
Text组建赋值的时候,如果是那种经常修改的Text需要用两个Text组件来代替。一个用于静态显示,一个用于动态显示。动静分离。
动静分离
UI面板里面有动态刷新Text的和不需要实时更新的组件,两者要放在不同的canvans下面,动静分离。
装箱操作
将一个值类型的变量赋值给一个引用类型的变量的时候会产生装箱操作。常见的是给Text赋值的时候,传入Lv,一个int值,需要使用Lv.tostring(),转换而不是使用“”+Lv操作。
变量new
协程里面经常用到yield return new WaitForSeconds(1f);我们可以在外部使用一个变量来记录下来,不要每次都new一个出来。平时使用的List也是自己要写一个ListPool来缓存使用。
定时GC
可以在切换场景的时候调用GC.Collect和Unity的UnloadusedAssets
IEqualityComparer
C# 在Dictionary 的主要接口 Add / ContainsKey / TryGetValue 在被调用时都需要对传进来的 TKey 调用默认的 IEqualityComparer来判断是否相等
this.comparer = comparer ?? EqualityComparer<TKey>.Default;
IEqualityComparer会为你创建一个Comparer。要避免这一问题,可以人为指定对象的Comparer 或者对你的自建struct实现Equals() 和 GetHashCode() 等方法。
(持续更新中ing…)