【游戏技术群】959392658  【游戏出海群】12067810
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

首页   >   博客   >   实践者

Unity3D代码性能优化

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

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

0 0

评论 (0 个评论)

facelist doodle 涂鸦板

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

个人分类

阅读排行

评论排行

推荐博客

最新博客

返回顶部