C# Unity Update()性能

C# Unity Update()性能,c#,unity3d,C#,Unity3d,我需要实现两个功能: 运动 轮换 两者都必须在Update()中,我可以将其组合起来,但我更喜欢在每个Movement.cs和Rotation.cs中使用单独的脚本 所以我有两种方法: 在和中使用一个Update()将两者合并为一个脚本 分为两个脚本,每个脚本都有Update() 我的问题是:如果将它们分别放在每个Update()脚本中,而不是将一个Update()组合在一个脚本中,是否会降低性能 两个脚本都将附加到一个对象上,所以如果我有数百个对象 方法1-100个对象和100个脚本,带有Up

我需要实现两个功能:

  • 运动
  • 轮换
  • 两者都必须在
    Update()
    中,我可以将其组合起来,但我更喜欢在每个
    Movement.cs和Rotation.cs中使用单独的脚本

    所以我有两种方法:

  • 在和中使用一个
    Update()
    将两者合并为一个脚本
  • 分为两个脚本,每个脚本都有
    Update()
  • 我的问题是:如果将它们分别放在每个
    Update()
    脚本中,而不是将一个
    Update()
    组合在一个脚本中,是否会降低性能

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

    方法1
    -100个对象和100个脚本,带有
    Update()
    方法2
    -100个对象和200个脚本,带有
    Update()

    另一个问题:做
    方法2
    真的不好吗


    如果你能组合,就做吧。Unity MonoBehavior很有用,但会很快消耗您的资源,特别是当您同时运行多个脚本时

    查看此博客票证:

    你该怎么办

    当然,这一切都取决于您的项目,但在现场并不罕见地看到游戏在场景中使用大量的游戏对象,每帧都执行一些逻辑。通常,一点点代码似乎不会影响任何东西,但当数量增长非常大时,调用数千个更新方法的开销开始变得明显


    如果你能组合,就做吧。Unity MonoBehavior很有用,但会很快消耗您的资源,特别是当您同时运行多个脚本时

    查看此博客票证:

    你该怎么办

    当然,这一切都取决于您的项目,但在现场并不罕见地看到游戏在场景中使用大量的游戏对象,每帧都执行一些逻辑。通常,一点点代码似乎不会影响任何东西,但当数量增长非常大时,调用数千个更新方法的开销开始变得明显


    也许第三个选项更适合您,它详细阐述了第一个选项,但仍然将您的逻辑划分为两个独立的区域,从而实现了您最初追求的松散耦合

    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
        }
    }
    

    也许第三个选项更适合您,它详细阐述了第一个选项,但仍然将您的逻辑划分为两个独立的区域,从而实现了您最初追求的松散耦合

    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
        }
    }
    

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

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


    回到手头的问题上,进行2次更新将使您每帧多花费一次函数调用,并在首次加载MonoBehavior时花费一些时间,但这可以忽略不计,您将在代码的其他部分消耗更多的CPU周期

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

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


    回到手头的问题上,进行2次更新将使您每帧多花费一次函数调用,并在首次加载MonoBehavior时花费一些时间,但这可以忽略不计,您将在代码的其他部分消耗更多的CPU周期

    以下是我对
    Update()
    如何与一些常见的Unity3d函数进行比较所做的一些测试

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

    平均FPS值被严重平滑,我使用Mono后端

    因此,
    Update()
    函数的成本似乎比使用
    transform.localposition
    移动一个空的
    GameObject
    要低一些

    我使用了Unity3d 2020.1.5


    以下是我对
    Update()
    如何与一些常见的Unity3d函数进行比较所做的一些测试

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

    平均FPS值被严重平滑,我使用Mono后端

    因此,
    Update()
    函数的成本似乎比使用
    transform.localposition
    移动一个空的
    GameObject
    要低一些

    我使用了Unity3d 2020.1.5


    这是一个很好的链接。无论如何,我想我的目标不会超过300。如果我使用方法2,我将有600个Update()。它是为移动设备设计的。你觉得还好吗?没有什么比测试更好的了!但特别是在移动设备上,如果你不费吹灰之力就能节省资源,那就去做吧。你真的不知道你的玩家将拥有的手机的威力。是的,我想我会先试试第一第二种方法。并检查探查器。并尽最大可能测试极限。这是一个很好的链接。无论如何,我想我的目标不会超过300。如果我使用方法2,我将有600个Update()。它是为移动设备设计的。你觉得还好吗?没有什么比测试更好的了!但特别是在移动设备上,如果你不费吹灰之力就能节省资源,那就去做吧。你真的不知道你的玩家将拥有的手机的威力。是的,我想我会先试试第一第二种方法。并检查探查器。这看起来不错,我将测试这个方法,因为
    GetComponent
    是一个“重”方法,我建议将转换组件直接作为参数缓存唤醒/启动函数中MonoBehavior的转换组件这看起来不错,我将测试这个方法,因为
    GetComponent
    是一个“沉重”的方法,我建议直接将转换组件作为参数