1.GameObject优化 2.容器选择 3.复杂计算结果缓存 1.GameObject优化 1 ) . 属性优化 GameObject的tag, layer, name等字符串属性会带来性能开销, 因为这些字符串属性在Unity是通过桥接获取的, 频繁调用会 导致性能下降 a. Tag优化- 避免使用if ( gameObject. tag== "TagName" ) - 推荐使用if ( gameObject. CompareTag ( "TagName" ) ) - 因为CompareTag方法内部使用整数比较, 效率更高 b. Layer优化- 避免频繁使用: if ( gameObject. layer== LayerMask. NameToLayer ( "LayerName" ) ) - 推荐先缓存LayerMask. NameToLayer的结果, 因为NameToLayer是通过字符串查找层索引, 开销较大- 然后使用缓存后的层索引进行判断: if ( gameObject. layer== cachedLayer) c. Name优化 避免在每帧中使用gameObject. name进行字符串比较, 因为gameObject. name会分配新的字符串; 如果对象的名称不会改变, 可 以在一开始缓存gameObject. name, 然后使用缓存的字符串进行比较2 ) . 减少Find相关方法的使用 GameObject的Find系列方法, 在运行时遍历场景中的对象并通过字符串比较, 效率很低 a. 尽量避免在Update, FixedUpdate等每帧调用的方法中使用Find系列方法 b. 在Start或Awake中缓存所需对象的引用 c. 使用序列化字段在Inspector中赋值, 避免运行时查找2.容器选择 容器选择就是在Unity中使用合适的数据结构类来装载数据 a. List- 存储结构是连续的, 查找的时间复杂度是O ( n) b. Dictionary- 存储结构是不连续的, 查找的时间复杂度是O ( 1 ) c. HashSet< T> - 查找/ 添加/ 删除都是O ( 1 ) , 内部使用哈希表实现; 只关心元素是否存在, 不需要顺序, 也不 需要键值对映射 d. Queue< T> - 入队, 出队都是O ( 1 ) , 适合先进先出 e. Stack< T> - 入栈, 出栈都是O ( 1 ) , 适合先进后出 f. LinkedList< T> - 插入, 删除节点是O ( 1 ) , 查找是O ( n) g. SortedDictionary< TKey, TValue> 、SortedList< TKey, TValue> - 会自动根据Key排序, 插入、删除、查找为O ( log n) , 比Dictionary慢, 但顺序稳定 h. ConcurrentDictionary、ConcurrentQueue 等- 线程安全的集合, Unity主线程中基本不使用, 适合多线程工具层代码中3.复杂计算结果缓存 复杂计算结果缓存指的是避免重复运行开销大的运算, 将结果缓存起来, 从而减少cpu运算量; 这类优化适用于频繁执行但变 化不频繁的逻辑 a. 数学计算结果缓存 我们可以在初始化项目基础数据时, 把各种数据提前算好; 以三角函数为例, 我们可以用一个float 数组存储0 ~ 359 度所有 Sin、Cos等等三角函数值 b. 寻路计算结果缓存 如果项目中存在A* 寻路等寻路算法, 可以用容易缓存两个点之间的路径, 下次寻路时, 发现存在已寻路点, 直接获取路径来使用 c. 静态配置数据缓存 对于配置表中数据, 特别是需要频繁使用的表, 我们应该在进入游戏时就反序列化后存储在内存中; 避免每次使用配置数据 都重复反序列化