Unity Update()性能

时间:2016-12-20 16:41:18

标签: c# unity3d

我有两个需要实现的功能:

  1. 运动
  2. 旋转
  3. 两者都必须在Update()中,我可以合并它但我更喜欢在每个Movement.cs and Rotation.cs的单独脚本中使用它们。

    所以我有两种方法:

    1. 将两者合并到一个脚本中并使用一个Update()
    2. 分为两个脚本,每个脚本都有Update()
    3.   

      我的问题:如果将它们分成每个人Update()而不是在一个脚本中与一个Update()合并,是否会降低性能。

      两个脚本都将附加在一个对象上,所以如果我有数百个对象。

      Method 1 - 100个对象和100个带Update()的脚本。 Method 2 - 100个对象和200个带Update()的脚本。

        

      另一个问题:Method 2真的很糟糕吗?

4 个答案:

答案 0 :(得分:4)

这是微优化的一个案例。你应该使用在你的特定情况下更有意义的任何方法,在你完成之后你应该进行一些分析。

根据分析结果,您最终会知道优化的位置和内容。

回到手头有2个更新的问题将花费你每帧多一次函数调用以及首次加载MonoBehavi的时间,但这可以忽略不计,你会吃更多代码其他部分的CPU周期。

答案 1 :(得分:2)

如果你可以结合,那就去做吧。 Unity MonoBehaviours非常有用,但可以快速占用您的资源,特别是如果您有许多脚本同时运行。

查看此博客凭证:https://blogs.unity3d.com/2015/12/23/1k-update-calls/

  

你应该做什么?

     

当然这一切都取决于你的项目,但是在现场看到场景中使用大量GameObjects的游戏并不罕见,每个游戏都在每帧执行一些逻辑。通常它只是一些似乎没有影响任何东西的代码,但是当数量变得非常大时,调用数千个Update方法的开销开始变得明显。

答案 2 :(得分:2)

也许第三个选项对你来说会更好,它详细说明了第一个选项,但仍然将你的逻辑分成两个独立的区域,从而实现了你最初的松散耦合。

public static class Manipulators
{
    public static void Rotate(MonoBehaviour behaviour, float amount)
    {
        Transform t = behaviour.GetComponent<Transform>();
        // Do stuff with t
    }

    public static void Move(MonoBehaviour behaviour, float amount)
    {
        Transform t = behaviour.GetComponent<Transform>();
        // Do stuff with t
    }
}

然后在你的monobehaviour ......

public void Update()
{
    Manipulators.Rotate(this, 15f);
    Manipulators.Move(this, 15f);
}

答案 3 :(得分:0)

这是我针对Update()与某些常见Unity3d函数进行比较所做的一些测试。

场景中有 10000个空游戏对象,上面带有UpdateTest脚本。

平均FPS值经过平滑处理,我​​使用Mono后端。

因此,Update()函数的开销似乎比使用GameObject移动空的transform.localposition的开销要小。

我用过Unity3d 2020.1.5

Update() and manager function test images