版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
Unity 之 动态加载物体卡顿简析
最近做Unity优化的时候发现游戏在第一次动态加载物体的时候会有卡顿,不管是加载一个大的预制体还是加载很对小的预制体,都有这个的情况出现,困扰良久。终于找到了问题的原因和几个注意事项,和大家分享一下,若有不足,敬请指正。
首先来看一段我们经常写的代码:加载一个游戏对象,将其实例化,并且添加脚本。
void StartLoad () {
GameObject go = Resources.Load("Image") as GameObject;
GameObject obj = GameObject.Instantiate(go);
obj.AddComponent<AddTest>();
}
你觉得上面三行代码,哪一行最耗时呢?我一直都认为是实例化(Instantiate)这个步骤最耗时,可是当我将其耗时分离开打印出来的时候才发现,第一次加载时耗时最大的却是加载游戏对象(Resources),,,而且差距还很大几倍到十几倍不等。
Unity的加载截图:
我的手机截图
上面结果的实践部分代码
【代码中这个 Image 预制体有90个带有Image组件的子物体,我这边添加的是一个空脚本,文章下面后面会说代码的耗时问题】
using System.Diagnostics;
using UnityEngine;
using UnityEngine.UI;
public class LoadGameObjectTest : MonoBehaviour {
public Text showText;
int count = 1;
void StartLoad () {
Stopwatch sw_Res = new Stopwatch();
sw_Res.Start();
GameObject go = Resources.Load("Image") as GameObject;
sw_Res.Stop();
showText.text += "\n";
showText.text += "\n <color=red>>>第" + count + "次 Resources 耗时:" + sw_Res.Elapsed.TotalMilliseconds + "毫秒</color>";
UnityEngine.Debug.Log("<color=red>>>第" + count+"次 Resources 耗时:" + sw_Res.Elapsed.TotalMilliseconds + "毫秒</color>");
Stopwatch sw_Ins = new Stopwatch();
sw_Ins.Start();
GameObject obj = GameObject.Instantiate(go);
sw_Ins.Stop();
showText.text += "\n <color=yellow>>>第" + count + "次 Instantiate 耗时:" + sw_Ins.Elapsed.TotalMilliseconds + "毫秒</color>";
UnityEngine.Debug.Log("<color=yellow>>>第" + count + "次 Instantiate 耗时:" + sw_Ins.Elapsed.TotalMilliseconds + "毫秒</color>");
Stopwatch sw_Add = new Stopwatch();
sw_Add.Start();
obj.AddComponent<AddTest>();
sw_Add.Stop();
showText.text += "\n <color=green>>>第" + count + "次 AddComponent 耗时:" + sw_Add.Elapsed.TotalMilliseconds + "毫秒</color>";
UnityEngine.Debug.Log("<color=green>>>第" + count + "次 AddComponent 耗时:" + sw_Add.Elapsed.TotalMilliseconds + "毫秒</color>");
count++;
}
void OnGUI()
{
if (GUI.Button(new Rect(100, 100, 100, 80), "加载按钮"))
{
StartLoad();
}
}
}