【问题标题】:The fastest way to rotate object Unity3DUnity3D旋转物体的最快方法
【发布时间】:2021-09-26 04:37:18
【问题描述】:

我想在 Update() 方法中移动和旋转大量对象。运动部分非常简单。问题与旋转性能有关。欧拉角的操作非常昂贵,我想优化这部分。

我都试过了

transform.rotation.eulerAngles += _rotationDirection * Time.deltaTime;

transform.Rotate(_rotationDirection * Time.deltaTime);

但它们的调用成本很高。

由于对象具有恒定的旋转值,我尝试了这个:

private void Awake()
{
    _rotationDelta = Quaternion.Euler(_rotationDirection * _rotationSpeed);
}

private void Update()
{
    transform.rotation *= _rotationDelta;
}

这似乎更高效,但我现在的问题是我不知道如何将 Time.deltaTime 链接到这个,因为你不能只写

transform.rotation *= _rotationDelta * Time.deltaTime;

所以,我的问题是,如果旋转增量在对象的生命周期内是恒定的,那么旋转对象的最快方法是什么?

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    有两个大问题:

    每帧一次调用(更新方法)

    未优化的算术 (Transform.rotate)

    改用刚体

    说明:
    Transform.Rotate 的工作方式是计算旋转并将旋转作为四元数返回,然后可以将其分配给旋转值。 Update 方法中的调用是一个很大的性能问题,因为它们在每一帧被丢弃之前被调用,并且可能导致卡顿或持续低 fps。

    解决所有这些问题的方法很简单,就是 RigidBody。 您应该将拖动和角度拖动设置为 0,这样旋转就不会减慢。 如果您不移动对象,也可以冻结位置。

    在游戏开始时调用一次(在 Start() 方法中):

    int angularPower = 5;
    
    void Start(){
        GetComponent<Rigidbody>().AddTorque(angularPower, 0, 0);
    }
    

    【讨论】:

    • 由于物理计算,RigidBody 不会消耗几乎相同数量的性能(与直接更改变换相比)吗?
    • 是的,这是真的。但是我们已经锁定了位置,这可能会通过跳过移动计算来消除开销。对 Transform 方法的调用也会消耗性能。同时,一开始只有一个对 RigidBody 的调用。而且 RigidBody 系统是 Unity Team 自己设计的,效率会很高。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多