unity性能优化-实际开发中需要注意的点
性能优化建议
在进行下面优化之前,建议先使用 Unity Profiler 定位真实的瓶颈。
优化核心原则:
能缓存的就缓存(变量、组件、材质)。
能不更新就不更新(降低 update 频率,使用事件驱动或Coroutine)。
避免在循环中分配内存(减少 new 关键字,使用对象池)。
1.复杂数学计算,比如mesh顶点数据的创建,大小和归一化属性都非常耗费 CPU(都涉及计算平方根)
可以使用对象池来空间换时间处理,涉及开根号的用平方比较
2.shader的合批处理
3.一些List,Vector不要用集合,而是指定它的大小
4.不要再update里面去大量调用Component(新手容易忽略重要)
5.优化字符串对比
6.常量的字符串写成类的成员变量
7.裁剪引擎,去掉音频
8.裁剪引擎,去掉物理,注意此时包括包围盒都不能使用
9.固定帧率,减少帧率
10.避免使用拆箱装箱
在C#中,装箱(Boxing)和拆箱(Unboxing)是指值类型与引用类型之间的转换。装箱是将值类型转换为对象类型(通常是将值类型包装在堆上),而拆箱则是从对象类型还原为值类型。
装箱(Boxing)开销
内存分配:
装箱过程中,会在堆上分配内存来存储值类型的数据。堆内存的分配通常比栈内存的分配慢,因为堆内存需要处理垃圾回收(Garbage Collection),而且堆内存分配涉及更多的管理操作。
数据复制:
装箱需要将值类型的数据从栈上复制到新分配的堆对象中。这涉及到数据的复制操作,增加了额外的开销。
垃圾回收:
装箱产生的堆对象最终会由垃圾回收器(GC)回收。垃圾回收是一个耗时的过程,会影响应用程序的性能。
拆箱(Unboxing)开销
类型检查:
拆箱过程中,需要进行类型检查,以确保对象确实是预期的值类型。这涉及到运行时的类型元数据访问和检查,增加了开销。
数据复制:
拆箱需要将堆上的数据复制回栈上。这同样涉及数据的复制操作,带来了额外的性能开销。
避免装箱和拆箱的方法
使用泛型:泛型可以减少装箱和拆箱的需要,因为泛型可以在编译时确定类型,而不需要在运行时进行类型转换,但是泛型带来另一个问题,即转换为il2cpp的时候,代码会膨胀,这个后面可以再说
[code]// 使用泛型避免装箱和拆箱List |