被自己蠢哭了,最简单的知识点到用的时候死活想不起来,记录一下加深印象
遇到这个问题时,我的第一反应是:一个Prefab很卡?不是应该很多个才会卡?很多个的话预加载啊,分帧加载啊,对象池啊。一个的话,难不成prefab很大,顶点数太多😂😂😂?思路顿时向歪路一路飞向天际。。
首先先说结论:
最大的可能是Prefab
的Awake
或OnEnable
方法做了太多操作。
当你实例化一个Prefab
时,不是加载显示出来就算完了,还会进行初始化,也就是完成Awake
,OnEnable
方法
以下方法做演示
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秒
并且可以看出,在完成加载之前,调用了Awake
和OnEnable
方法
4.下图是加了高耗时方法的加载时间,间隔1.2秒
总结,Awake
和OnEnable
方法尽量不要做太多初始化无关的操作,会大大延长加载时间