获得GameObject参考的最快方法是什么?

问题描述 投票:3回答:2

假设我的脚本定义如下。

public GameObject _GameObject;

private void Start()
{
    _GameObject = gameObject;
}

这样执行起来会更快吗?

public void SetActive(bool value)
{
    gameObject.SetActive(value);
}

或者这个?

public void SetActive(bool value)
{
    _GameObject.SetActive(value);
}
c# unity3d gameobject
2个回答
1
投票

在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/


1
投票

我假设缓存变量比使用gameObject类中的Component变量要快,并且简单的测试证明是正确的。那是因为缓存它会给您引用,而不是使用Component,后者使用gameObject访问器返回引用。不知道获取引用是否需要本机函数调用,但这是有可能的。使用get访问器比直接引用访问要慢。

假设您有1百万个脚本调用get或通过缓存的版本gameObject.activeSelf

测试结果:

gameObject:_GameObject.activeSelf毫秒

[已缓存_GameObject:54毫秒

经过测试的软件/硬件:

  • Unity 5.6.0f3
  • Windows 10专业版
  • MacBookPro11,4
  • 16 GB RAM

有关系吗?

在普通应用中,也许不是。在游戏中,是的。从游戏中删除30是一个很好的改进,具体取决于游戏的类型。

测试脚本:

24ms
© www.soinside.com 2019 - 2024. All rights reserved.