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

Posted 时光不染

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实例化一个Prefab比较卡可能的原因相关的知识,希望对你有一定的参考价值。

被自己蠢哭了,最简单的知识点到用的时候死活想不起来,记录一下加深印象
遇到这个问题时,我的第一反应是:一个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方法尽量不要做太多初始化无关的操作,会大大延长加载时间

以上是关于实例化一个Prefab比较卡可能的原因的主要内容,如果未能解决你的问题,请参考以下文章

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

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

unity 怎么让一个prefab一直在新实例化的prefab下面

unity, 保存prefab时material丢失问题

Unity快速入门教程-详解预制体(Prefab)及其实例化Instantiate

Unity3D研究院编辑器之不实例化Prefab获取删除更新组件(十五)