繁体   English   中英

获取 GameObject 引用的最快方法是什么?

[英]What is the fastest way to get GameObject reference?

假设我的脚本定义如下。

public GameObject _GameObject;

private void Start()
{
[![enter image description here][1]][1]
    _GameObject = gameObject;
}


这会执行得更快吗?

public void SetActive(bool value)
{
  [1]: https://i.stack.imgur.com/S60FB.jpg
    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/

我认为缓存变量比使用Component类中的gameObject变量更快,一个简单的测试证明这是真的。 那是因为缓存它会为您提供引用,而不是使用使用get访问器返回引用的gameObject 不确定获取引用是否需要本机函数调用,但这是一种可能性。 使用get访问器比直接引用访问慢。

假设您有 100 万个脚本调用gameObject.activeSelf或通过缓存版本_GameObject.activeSelf

测试结果:

游戏对象: 54毫秒

缓存 _GameObject: 30毫秒

软件/硬件测试:

  • 统一 5.6.0f3
  • 视窗 10 专业版
  • MacBookPro11,4
  • 16 GB 内存

有关系吗?

在普通的应用程序中,也许不是。 在游戏中,是的。 根据游戏的类型,从游戏中删除24ms是一个很好的改进。

测试脚本:

public GameObject _GameObject;

void Start()
{
    Application.runInBackground = true;

    int iterations = 1000000;

    //TEST 1
    Stopwatch stopwatch1 = Stopwatch.StartNew();
    for (int i = 0; i < iterations; i++)
    {
        bool active = gameObject.activeSelf;
    }
    stopwatch1.Stop();

    //TEST 2
    Stopwatch stopwatch2 = Stopwatch.StartNew();
    for (int i = 0; i < iterations; i++)
    {
        bool active = _GameObject.activeSelf;
    }
    stopwatch2.Stop();
    //SHOW RESULT
    WriteLog(String.Format("gameObject: {0}", stopwatch1.ElapsedMilliseconds));
    WriteLog(String.Format("Cached _GameObject: {0}", stopwatch2.ElapsedMilliseconds));
}

void WriteLog(string log)
{
    UnityEngine.Debug.Log(log);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM