Unity Update优化

本文通过对比20,000个对象上独立Update与集中调用的方式,展示了Unity游戏中性能优化的重要技巧。集中调用Update能显著降低每帧耗时,从5毫秒减少到不足1毫秒。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试一下MonoBehaviour自己的Update函数调用消耗

创建20000个物体,每个物体上挂载一个带有MonoBehaviour自己的Update,脚本如下:

public class TestUpdate1 : MonoBehaviour
{
    private void Update()
    {
        float a = 1.513f + 1.5141f;
        float b = 1.513f + 1.5141f;
        float c = 1.513f + 1.5141f;
        float d = a * b / c;
    }
}

看看每帧耗时:
这里写图片描述

每帧大约耗时5毫秒


再来试试把所有的Update集中调用
创建20000个物体,每个物体上挂载一个集中调用的Update,脚本如下:

public class TestUpdate : ComponentBase, IUpdate
{
    public void OnUpdate()
    {
        float a = 1.513f + 1.5141f;
        float b = 1.513f + 1.5141f;
        float c = 1.513f + 1.5141f;
        float d = a * b / c;
    }
}

然后使用一个UpdateManager统一调用,代码如下:

public class UpdateManager : SingletonBehaviour<UpdateManager>
{
    private List<IUpdate> _updateList = new List<IUpdate>();

    /// <summary>
    /// 添加更新
    /// </summary>
    /// <param name="call"></param>
    public void Add(IUpdate call)
    {
        if (!_updateList.Contains(call))
            _updateList.Add(call);
    }

    /// <summary>
    /// 移除更新
    /// </summary>
    /// <param name="call"></param>
    public void Remove(IUpdate call)
    {
        if (_updateList.Contains(call))
            _updateList.Remove(call);
    }

    private void Update()
    {
        for (int i = 0; i < _updateList.Count; ++i)
            _updateList[i].OnUpdate();
    }
}

再来看看每帧耗时:
这里写图片描述

每帧耗时不到1毫秒


说明集中调用确实会比使用MonoBehaviour自己的Update更有效率,同样Awake,Start这些生命周期函数也是一样的,但是这些函数只执行一次,一般可以不用优化.
经过测试,这个耗时差和场景对象数量成正比,数量越多,耗时差就越大.


非常的简单.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值