IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Unity GC Cheatsheet

    Gu Lu\'s Blog发表于 2017-02-18 11:37:00
    love 0

    关于 Unity 的垃圾回收 (GC) 你可能已经看到不少的文章讨论了。下面是一个极简形式的 Cheatsheet,希望能在最小的篇幅内尽可能全面地列出关于 GC 你需要注意的事项。


    Unity GC Cheatsheet


    • a01. struct Foo 在栈上,但 struct Foo[] 分配在堆上
    • a02. GetType() 会产生 GC Alloc (每个调用 20 Bytes)
    • a03. delegate 的创建时 (赋值 = 或以参数传递) 在堆上分配 (如将方法做为参数传入)
    • a04. delegate 尽量使用 = 而不是 += (后者会导致 InvocationList 不断增长且会被调用多次)
    • a05. 在针对 GC Alloc 做优化时,对象数量 > 引用关系复杂度 > 对象尺寸
    • a06. 当可以使用整数句柄来代替引用时,尽量使用整数句柄 (简化引用关系)
    • a07. 优化内存布局:利用“数组对 GC 而言是单一对象”这一特性
    • a08. (a01推广) 单个 ValueType 直接在栈上分配,但 ValueType Array 总是分配在堆上

    • b01. 避免频繁调用分配内存的 accessors (如 .vertices/.normals/.uvs/.bones)
    • b02. 避免频繁调用 Int.ToString() 及其它类型的衍生
    • b03. 避免在 Update() 内使用 GameObject.Tag 和 GameObject.Name
    • b04. 避免在 Update() 内 GetComponent()
    • b05. 避免在 Update() 内 GetComponentInChildren(),可自己实现无 GC 版本
    • b06. 避免在 Update() 内访问 animation 组件
    • b07. 避免在 Update() 内 FindObjectsOfType()
    • b08. 避免在 Update() 里赋值给栈上的数组,会触发堆内的反复分配
    • b09. 避免频繁使用 Mathf.Max 等函数的数组版(多于两个参数都会调到数组版)
    • b10. (b09 推广):所有具有 params 修饰的函数都应避免频繁使用(以避免临时数组的分配)

    • c01. 在不需要时避免使用 GUILayout - OnGUI 时把 useGUILayout 关掉
    • c02. 避免使用 foreach (除非遍历数组,或直接用 VS 预编译好的 dll)(Unity 5.5 已修复此问题)
    • c03. 避免使用枚举或 struct 做 Key 进行字典查找 (除非使用定制的 comparer)
    • c04. 避免使用字符串版本的 Invoke 和 StartCoroutine
    • c05. 避免在产品中调用 Debug.Log (生成堆栈字符串)
    • c06. 避免在产品中使用 Linq
    • c07. 在可能的情况下复用成员变量而不是不断分配新对象
    • c08. 初始化 List<> 时指定合理的 Capacity
    • c09. 使用 StringBuilder 而不是使用 “+” 或 String.Concat() 拼接字符串
    • c10. 在使用协程 yield 时尽量复用 WaitXXX 对象 (使用 Yielders.cs) 而不是每次分配
    • c11. 确保 struct 实现了 IEquatable
    • c12. 确保 struct 实现了 Equals() 和 GetHashCode()

    • 本文首先发布于公众号西山居技术
    • 永久链接: http://gulu-dev.com/post/perf_assist/2017-02-18-unity-gc-cheatsheet
    • 本文遵循 Creative Commons BY-NC-ND 4.0 许可协议
    • 此列表将在这里 (Unity GC Cheatsheet)持续维护和更新
      • 在这里 (Unity GC Cheatsheet - Detail explanations) 可看到这些条目 (部分) 的进一步说明
      • 在这里 (Unity GC Cheatsheet - References) 可以看到汇总的参考链接

    (完)
    Gu Lu
    [2017-02-18]



沪ICP备19023445号-2号
友情链接