Unity函数性能测试:对象的显示与隐藏
不挂载脚本时的正方体
Instantiate(GameObject)和Destroy(GameObject)
用时391毫秒
调用SetActive()
用时58毫秒
修改transform.position
用时2毫秒
挂载一个含有空Start()和Update()脚本的正方体
Instantiate(GameObject)和Destroy(GameObject)
用时581毫秒(提升190毫秒)
调用SetActive()
用时67毫秒(提升10毫秒)
修改transform.position
用时2毫秒(无提升)
结论及代码
避免高频创建GameObject(尤其是复杂的GameObject),SetActive()慢点但在性能要求不高时可用,但还是尽量通过改变位置来隐藏对象
using UnityEngine;
public class Test : MonoBehaviour
{
public GameObject prefab;
public bool buttonSetActive;
public bool buttonInsDes;
public bool buttonTransform;
private void Start()
{
prefab = Instantiate(prefab);
}
private void Update()
{
if (buttonSetActive)
{
buttonSetActive = false;
SetActiveTest();
}
if (buttonInsDes)
{
buttonInsDes = false;
InsDesTest();
}
if (buttonTransform)
{
buttonTransform = false;
TransformTest();
}
}
private void SetActiveTest()
{
for (int i = 0; i < 10000; i++)
{
prefab.SetActive(false);
prefab.SetActive(true);
}
}
private void InsDesTest()
{
for (int i = 0; i < 10000; i++)
{
Destroy(Instantiate(prefab));
}
}
private void TransformTest()
{
for (int i = 0; i < 10000; i++)
{
prefab.transform.position = new Vector3(999, 999, 999);
prefab.transform.position = new Vector3(0, 0, 0);
}
}
}