【Unite 2017 Tokyo】记忆体与 CPU 使用率最佳化技术

发表于2017-06-14
评论0 1.5k浏览
C++:OnTransformChanged
当 Transform Position, Rotation 或 Scale 改变以及 Animators, Physics 影响时执行数次

C#:OnBeforeTransformParentChanged
C#:OnTransformParentChanged
当 Transform 的父物件改变时执行

导致效能花费昂贵的原因有
1. 要求所有 Transform 以及子物件执行
2. 物理相关 Component 会更新物理画面
3. 重新计算渲染的 Bounding Box
4. 更新粒子系统的 Bounding Box


在 Unity 5.6 中有新的 API
Transform.SetPositionAndRotation
可以改善直接修改 Transform.position 和 Transform.rotation 的效能
Animator

在 FBX Importer, Rig options 中的优化选项 Optimize Game Object
https://docs.unity3d.com/Manual/FBXImporter-Rig.html

主要作用有:
1. 用较好的多执行绪方式重新排列动画资料
2. 将模型 Transform 阶层关系中多馀的物件删除(可以在 Extra Transforms 中加入特例清单)
3. Mesh Skinning 多执行绪
Physics

影响效能的两个主要因素:
1. 物理模拟(Rigidbody 更新)
2. 物理队列(Raycast, SphereCast, etc)

效能花费
1. 与场景的複杂度与密度有密切关联
2. Box Collider, Sphere Collier 花费低
3. Mesh Collider 花费相当高

物理队列(Physics Queries)
1. 在世界空间中收集潜在碰撞,由 PhyX(“broad phase”) 执行
2. 在潜在碰撞中根据 Layers 进行筛选,由 Unity 执行
3. 对每个潜在碰撞体进行测试以寻找真实碰撞,由 PhyX(“midphase” & “narrow phase”) 执行

如何减少潜在碰撞
1. 将世界空间分割成数个小区域
2. 根据场景密度来限制射线长度
3. 设定射线最大碰撞距离

用准确性来换取效能
1. 降低 Fixed Timestep
2. 依据 FPS 规格来调整 Fixed Timestep
3. 大多数游戏可以接受 0.04 或 0.08


在有 Rigidbody 的物件上
不要透过 Transform 来进行位移
而是透过 Rigidbody.MovePosition, Rigidbody,MoveRotation


 

Memory Profiler(IL2CPP)

https://bitbucket.org/Unity-Technologies/memoryprofiler
作用:显示在记忆体中的所有 UnityEngine.Objects 以及 C# objects

HideFlags
若是将资源设定成 HideFlags.HideAndDontSave 则永远不会卸载


Texture

确保贴图设定为 non-readable
若是 Read/Write Enabled 开启
记忆体使用量会变成两倍

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引