![](/img/trans.png)
[英]What's the fastest way to get an ObjectContext reference from an entity object?
[英]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
毫秒
软件/硬件测试:
有关系吗?
在普通的应用程序中,也许不是。 在游戏中,是的。 根据游戏的类型,从游戏中删除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.