找回密码
 注册帐号

扫一扫,访问微社区

实践者

Unity3D代码性能优化

热度 13546 2018-12-21 09:31 |个人分类:Unity3d优化

1避免使用GameObject.Find

许多学习资源将教授在学习脚本的早期阶段使用GameObject.Find 尽可能方便,尽量不要使用它。原因:

a)每当调用此函数时,它将遍历整个层次结构以查找具有匹配名称的GameObject 如果你有一个包含许多GameObjects的大型Hierarchy并且你不断地调用它,那么它将显着降低你的性能

b)重命名你的GameObject会打破脚本! 如果您的脚本中有一个工作引用到现有GameObject,并且由于某种原因您将其重命名为该行,则找不到GameObject并为函数调用返回null

2何时何地使用GetComponent

a)与#1类似,无论何时调用GetComponent,它都会对当前GameObject的组件进行线性搜索,以查找MonoBehaviour引用。 如果您经常这样做,或者如果您在Update功能中,并且您的GameObject上有许多组件,它可以加起来。

那么什么时候可以使用GetComponent

b)如果使用GetComponent在场景开始时分配引用(例如,在Start()或Awake()函数中),则只调用一次。 您只需在场景开始时获得一小段性能,但在加载完所有内容后,您将直接引用MonoBehaviour,这意味着可以直接快速地访问所有内容。 如果我不想使用GetComponent,我有什么选择?

MonoBehaviour脚本中,您可以执行以下操作来序列化您的参考

[SerializeField]private AudioSource audioSource;

--- or --

public AudioSource audioSource;

3Camera.main困境

许多教程将使用Camera.main来获取场景中的主摄像头。 每当你调用这个函数时,Unity实际上都会调用GameObject.FindGameObjectsWithTag(“MainCamera”)。 此调用遍历整个层次结构,直到它找到第一个启用了具有MainCamera标记的GameObject并检索其Camera组件(如果存在)。 注意:这不是缓存的。

使用Unity UIUGUI)时,无论何时创建Canvas并将渲染模式设置为屏幕空间 - 摄像机或屏幕空间 - World,它都会要求您选择渲染摄像机。 如果你没有选择一个,它实际上会调用Camera.main函数来尝试将当前的Canvas调整到一定的大小。

4更智能地实例化GameObjects

大多数人都没有意识到GameObject.Instantiate函数有很多重载构造函数,最重要的一个应该是这个:

public static Object Instantiate(Object original, Transform parent);

使用这种实例化方法,直接在提供的父物体transform下创建新的GameObject。 或者,如果您未提供此父Transform,则必须首先在根Transform下创建它并重新父实例化新实例化的GameObject。 这种额外的分配可能是浪费的。 进行这一小改动可以将性能提高5-10%。

5点击一下优化SkinnedMeshRenderers

每当您使用骨骼装备导入FBX时,Unity都会将其视为SkinnedMeshRenderer,因此将在层次结构中为FBX中的每个骨骼创建一个Transform。 如果你没有对装备的变形做任何事情(即将武器绑定到手或帽子到头部),这些变换不做任何事情,并且每帧执行无意义的计算。 要优化此选项,请在“项目”窗口中选择FBX,然后导航到“钻机”选项卡。

应该有一个复选框标签Optimize Game Objects位于底部。 检查并应用设置后,您将看到转换已消失。 如果仍然需要用手和头部将其他对象绑定到装备,则可以根据需要单独显示这些对象,方法是将Extra Transforms展开为Expose并在装备中添加单个Transforms

发表评论 评论 (3 个评论)

回复 wangjdq123 2018-12-25 10:31
想问下 关于GameObject.Instantiate 经过认真测试么?实例化的对象是否有节点比较复杂,同一帧下对同一个节点实例化多个子节点的时候 会不会比没有指定父节点的实例化更耗时?
回复 图腾骨雕 2019-1-2 09:53
unity菜鸟提问:没看懂第四个,您的意思是使用哪种方法进行实例化才更节省性能呢?
回复 kira43216987 2019-2-22 11:47
最后一项看不太懂可以用图片步骤演示一下吗?

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册帐号