实例化一个Prefab比较卡可能的原因

本文探讨了Unity中Prefab加载慢的原因,指出Awake和OnEnable方法内执行过多操作可能导致加载时间延长。通过实例展示了高耗时方法如何影响Prefab实例化时间,建议避免在这些生命周期方法中进行初始化无关的繁重操作,以优化性能。

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

被自己蠢哭了,最简单的知识点到用的时候死活想不起来,记录一下加深印象
遇到这个问题时,我的第一反应是:一个Prefab很卡?不是应该很多个才会卡?很多个的话预加载啊,分帧加载啊,对象池啊。一个的话,难不成prefab很大,顶点数太多😂😂😂?思路顿时向歪路一路飞向天际。。

首先先说结论:
最大的可能是PrefabAwakeOnEnable方法做了太多操作。
当你实例化一个Prefab时,不是加载显示出来就算完了,还会进行初始化,也就是完成AwakeOnEnable方法

以下方法做演示
1.实例化一个prefab,并输出真实时间

 void Start()
    {
        Debug.Log($"开始时间:{time1 = Time.realtimeSinceStartup}");
        Instantiate(Resources.Load("prefab"),this.transform) ;
        Debug.Log($"结束时间:{time2 = Time.realtimeSinceStartup}");
        Debug.Log($"间隔:{time2 - time1}");
    }

2.在Awake或OnEnable里加入一个高耗时的方法。我这里加了个递归运算。

	float time1 = 0;
	private void Awake() {
        Debug.Log("Awake");
        
    }
    private void OnEnable() {
        time1 = Time.realtimeSinceStartup;
        RecUrcive(40);
        Debug.Log($"运算时间:{Time.realtimeSinceStartup - time1}");
        Debug.Log("OnEnable");
    }
    private void Start() {
        Debug.Log("Start");
    }

    public int RecUrcive(int index)
    {
        if (index<3)
        {
            return 1;
        }
        else
        {
            return RecUrcive(index - 2) + RecUrcive(index - 1);
        }
    }

3.下图是没有加高耗时方法时的加载时间,间隔0.058秒
并且可以看出,在完成加载之前,调用了AwakeOnEnable方法

4.下图是加了高耗时方法的加载时间,间隔1.2秒

总结,AwakeOnEnable方法尽量不要做太多初始化无关的操作,会大大延长加载时间

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值