首先
1.Edit > Project Settings > Quality 级别选最低 Very Low (根据情况选择)
2.Window > Rendering > Lighting Settings > Realtime Global Illumination . Baked Global Illumination 关闭全局实时光和烘培光
3.(16可能会导致的问题:Mask失效,模型透明看不见,shader未知BUG)在此面板的深度格式设置下选择16 位深度,尤其是 HoloLens 开发。与 24 位相比,选择 16 位将显著降低带宽要求,因为需要移动/处理的数据更少
4.避免 GetComponent(string)
使用 GetComponent() 时,会产生少量不同的重载。 必须始终使用基于类型的实现,切勿使用基于字符串的搜索重载。 在场景中按字符串进行搜索,比按类型进行搜索的开销要高得多。
(正确)Component GetComponent(Type type)
(正确)T GetComponent<T>()
(错误)Component GetComponent(string)>
5.建议在初始化时 缓存 对所有相关组件和 GameObject 的引用,因为重复函数调用(如 GetComponent() 和 Camera.main)相对于存储指针的内存成本更昂贵。 . Camera.main 仅在后台使用 FindGameObjectsWithTag() ,但而它会以很高的开销在场景图中搜索具有“MainCamera”标记的 camera 对象
6.某些 Unity API 虽然很有用,但其执行开销可能很高。 其中的大部分 API 都涉及到在整个场景图中搜索 GameObject 的匹配列表。 一般情况下,若要避免这些操作,可以缓存引用,或者实现 GameObject 的管理器组件,以在运行时跟踪引用。应该消除 SendMessage() 和 BroadcastMessage() 的所有开销。
尽量少使用的API: GameObject.SendMessage()
GameObject.BroadcastMessage()
Object.Find()
Object.FindWithTag()
Object.FindObjectOfType()
Object.FindObjectsOfType()
Object.FindGameObjectsWithTag()
Object.FindGameObjectsWithTag()
7.要避免装箱操作
列如错误做法:bool myVar = true; object boxedMyVar = myVar;
请确保使用强类型列表(例如 List<int>),而不是 List<object> 或 ArrayList。
8.删除空Update
在应用程序中保留以下代码看似没有妨碍,尤其是因为每个 Unity 脚本都要通过此 Update 方法自动初始化,但这些空回调的开销可能非常高。 Unity 在 UnityEngine 代码与应用程序代码之间的非托管和托管代码边界之间来回操作。 通过此桥梁进行上下文切换会产生相当高的开销,即使没有要执行的操作。 如果应用具有数百个 GameObject 以及包含空重复性 Unity 回调的组件,则此操作特别容易造成问题。
9.避免使用网格碰撞体,其开销要比基元碰撞体高出太多。
(最终测试完成删除所有)删除不再需要的 Debug.Log() 调用,因为它们仍会在应用的所有生成版本中执行
10.使用对象池
11.如果全息应用通常需要大量的内存,请考虑在加载阶段(例如,在演示加载或过渡屏幕时)调用 System.GC.Collect()
详情请查看官方地址:针对 Unity 的性能建议 - Mixed Reality | Microsoft Docs