Unity 项目注意点总结 (持续更新)

Unity 中使用 foreach 遍历不会有 GC

将函数作为参数时必须使用匿名方式且必须不发生闭包

直接传递函数的情况必然会有 GC, 无论传递的函数是否为静态函数

1
2
3
4
5
6
7
// 传递普通方法 Sum, 会有 GC
Launch(Sum);
private void Sum() { }

// 传递静态方法 Sum, 同样有 GC
Launch(Sum);
private static void Sum() { }

使用匿名方式传递函数, 则根据是否闭包决定有无 GC

1
2
3
4
5
6
7
8
9
10
11
12
13
// Sum 是闭包, 会有 GC
Launch(() => Sum());
private void Sum()
{
sum++;
}

// Sum 不是闭包, 无 GC
Launch(() => Sum());
private static void Sum()
{
sum++;
}

Unity 的 Git 仓库必须添加 RenameLimit 限制

1
2
3
4
[diff]
renameLimit = 1
[merge]
renameLimit = 1

Unity 的 Git 仓库必须添加 .gitattribute 配置

https://github.com/gitattributes/gitattributes

Unity 项目所在电脑必须设置开启 "Unicode UTF-8 提供全球语言支持"

Unicode UTF-8体提供全球语言支持

编程时 struct 内的字段必须是纯值类型, 如果含有引用类型, 请使用 class

  1. struct 中的字段禁止使用引用类型
  2. 当一个数据体内部的全部字段是一个不可变化的整体时, 才能使用 struct, 并且每一个 struct 都是一个独立的数据副本

性能优化时, 顶点数小于 300 的网格禁止参与静态批处理

当小于 300 定点数的网格参与静态批处理时, 即使它仅仅作为一个 submesh 存在, 但会导致整个静态网格的 KeepVertices 被开启, 导致顶点信息被保留在内存中, 从而使整个网格的内存占用翻倍

编程中关于 Null 值的处理

返回值

最终优化为: 项目中不存在任何的 return null 语句

优化措施:

  1. 对于值类型的返回值, 将合法的 return null 全部改为有效空白值, 比如 string.Empty, 0, -1 等
  2. 对于引用类型的返回值, 将合法的 return null 全部改为 out 类型参数返回, 本来的返回值改为 bool
  3. 任意类型的非法的 return null 全部删除, 改为输出错误日志并抛出异常

参数

  1. 使用 debug 断言进行判断, 断言的好处是 release 版本中断言是不执行的. 因此只要在 debug 版本中进行全覆盖测试, 就可以直接在 debug 版本中就杜绝参数为 null 的情况

最终结论

任何方法不允许直接返回 class 对象. 以 Get 类型的方法为例, 返回的是 bool. class 值使用 out 参数进行返回