我们都知道 MonoBehaviour 类的 public 属性是会被unity自动序列化的,然后你就可以直接在对象上设置参数了,像这样:
但是这样的开销其实挺大的。
我们现在创建2种类,一种是集成MonoBehaviour的,绑定在cube上,我们来加载1000个进来。一种是普通的c#类,我们也加载1000个进来。(为什么加这么多,是因为加少了怕看不出区别来)
测试环境为Unity 4.6.6f2
,我的 5.3.1 出了点问题,所以只能拿个版本稍低点的来演示了
加载类:
public class GameMain : MonoBehaviour
{
public GameObject cube1;
public GameObject cube2;
public bool open1;
public bool open2;
private List<Cube1> m_cubeList1;
private List<Cube2> m_cubeList2;
// Use this for initialization
void Start()
{
System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
stopwatch.Start();
if (open1 && cube1 != null)
{
m_cubeList1 = new List<Cube1>();
for (int i = 0; i < 10000; ++i)
{
GameObject go = (GameObject)GameObject.Instantiate(cube1);
go.transform.parent = transform;
Cube1 temp = go.GetComponent<Cube1>();
m_cubeList1.Add(temp);
}
}
if (open2 && cube2 != null)
{
m_cubeList2 = new List<Cube2>();
for (int i = 0; i < 10000; ++i)
{
GameObject go = (GameObject)GameObject.Instantiate(cube2);
go.transform.parent = transform;
Cube2 temp = new Cube2(go);
m_cubeList2.Add(temp);
}
}
stopwatch.Stop();
System.TimeSpan timeSpan = stopwatch.Elapsed;
Debug.Log("加载用时 = " + timeSpan.TotalSeconds);
}
}
Cube1:
public class Cube1 : MonoBehaviour
{
public string txt_1 = "";
public string txt_2 = "";
public string txt_3 = "";
public string txt_4 = "";
public string txt_5 = "";
public string txt_6 = "";
public string txt_7 = "";
public string txt_8 = "";
public string txt_9 = "";
public string txt_10 = "";
void Start()
{
}
}
Cube2:
public class Cube2
{
public GameObject gameObject;
public Transform transform;
public string txt_1 = "";
public string txt_2 = "";
public string txt_3 = "";
public string txt_4 = "";
public string txt_5 = "";
public string txt_6 = "";
public string txt_7 = "";
public string txt_8 = "";
public string txt_9 = "";
public string txt_10 = "";
public Cube2(GameObject go)
{
gameObject = go;
transform = gameObject.transform;
}
}
我们看到它们都有 public 的属性,然后我们看它们分别运行的情况。
cube1
cube2
这里我们看到了,一个用时
519.01
,一个用时314.20
,差的还是蛮大的,而且 gc 时的内存也是超大的。MonoBehaviour 中的 public 属性导致了 2.8mb 的 gc,是普通c#类的2倍还多。
然后我们再把cube1和cube2中的public属性都去掉再来看看运行结果
cube1
cube2
这里我们看到,改善最明显的就是 gc 了,直接从 2.8mb 掉到了 0.7mb,2者之间的时间差距也有所缩短。
由此我们得出结论,MonoBehaviour 对 public 属性进行的序列化操作,其实是挺费的,且会产生大量的 gc,在这一点上,就不如使用普通的 c# 类来对 GameObject 进行管理来的高效了,但是我们也不能忽视 MonoBehaviour 和它的 public 属性所带来的便利性。