假设我的脚本定义如下。
public GameObject _GameObject;
private void Start()
{
_GameObject = gameObject;
}
这样执行起来会更快吗?
public void SetActive(bool value)
{
gameObject.SetActive(value);
}
或者这个?
public void SetActive(bool value)
{
_GameObject.SetActive(value);
}
在Unity 4.x及更低版本中,缓存方法将明显更快。在那些版本中,MonoBehaviour.transform和MonoBehaviour.gameObject实际上不是字段。相反,它们在“内部”的行为类似于带有附加访问器的属性。
因此访问gameObject属性将通过访问器对Component.get_gameobject()进行方法调用。当然,与简单的内存访问相比,方法调用自然会带来更多开销。 (转换更糟;显然访问器实际上调用了GetComponent方法来返回值!)
这就是为什么您会经常看到资深的Unity开发人员缓存这些值的原因。
我有很好的权限,已在Unity 5中简化了此过程以提高性能;使用内置属性仍会产生极少量的开销,但据报道是无关紧要的。
来源:https://blogs.unity3d.com/2014/06/23/unity5-api-changes-automatic-script-updating/
我假设缓存变量比使用gameObject
类中的Component
变量要快,并且简单的测试证明是正确的。那是因为缓存它会给您引用,而不是使用Component
,后者使用gameObject
访问器返回引用。不知道获取引用是否需要本机函数调用,但这是有可能的。使用get
访问器比直接引用访问要慢。
假设您有1百万个脚本调用get
或通过缓存的版本gameObject.activeSelf
。
测试结果:
gameObject:
_GameObject.activeSelf
毫秒[已缓存_GameObject:
54
毫秒
经过测试的软件/硬件:
有关系吗?
在普通应用中,也许不是。在游戏中,是的。从游戏中删除30
是一个很好的改进,具体取决于游戏的类型。
测试脚本:
24ms