Unity 项目注意点总结 (持续更新)
Unity 中使用 foreach 遍历不会有 GC
将函数作为参数时必须使用匿名方式且必须不发生闭包
直接传递函数的情况必然会有 GC, 无论传递的函数是否为静态函数
1 | // 传递普通方法 Sum, 会有 GC |
使用匿名方式传递函数, 则根据是否闭包决定有无 GC
1 | // Sum 是闭包, 会有 GC |
Unity 的 Git 仓库必须添加 RenameLimit 限制
1 | [diff] |
Unity 的 Git 仓库必须添加 .gitattribute 配置
https://github.com/gitattributes/gitattributes
Unity 项目所在电脑必须设置开启 "Unicode UTF-8 提供全球语言支持"
编程时 struct 内的字段必须是纯值类型, 如果含有引用类型, 请使用 class
- struct 中的字段禁止使用引用类型
- 当一个数据体内部的全部字段是一个不可变化的整体时, 才能使用 struct, 并且每一个 struct 都是一个独立的数据副本
性能优化时, 顶点数小于 300 的网格禁止参与静态批处理
当小于 300 定点数的网格参与静态批处理时, 即使它仅仅作为一个 submesh 存在, 但会导致整个静态网格的 KeepVertices 被开启, 导致顶点信息被保留在内存中, 从而使整个网格的内存占用翻倍
编程中关于 Null 值的处理
返回值
最终优化为: 项目中不存在任何的 return null 语句
优化措施:
- 对于值类型的返回值, 将合法的 return null 全部改为有效空白值, 比如 string.Empty, 0, -1 等
- 对于引用类型的返回值, 将合法的 return null 全部改为 out 类型参数返回, 本来的返回值改为 bool
- 任意类型的非法的 return null 全部删除, 改为输出错误日志并抛出异常
参数
- 使用 debug 断言进行判断, 断言的好处是 release 版本中断言是不执行的. 因此只要在 debug 版本中进行全覆盖测试, 就可以直接在 debug 版本中就杜绝参数为 null 的情况
最终结论
任何方法不允许直接返回 class 对象. 以 Get 类型的方法为例, 返回的是 bool. class 值使用 out 参数进行返回