哪个变量声明优化了内存性能

时间:2016-01-04 06:03:18

标签: c# unity3d

哪种方法优化内存还是相同? 方法1 GameObject是否为每个循环创建了新的内存分配?,因为我认为方法2 GameObject使用相同的内存引用。

  

Method 1是否会创建 GC 或创建会降低性能的新内存分配?

方法1

foreach (GameObject child in childs)
{
    GameObject obj = otherObj.GetComponent<Transform>().gameObject;
    //do something with obj
}

foreach(GameObject child in child2)
{
    GameObject obj = otherObj2.GetComponent<Transform>().gameObject;
    //do something with obj
}

方法2

GameObject obj;
foreach (GameObject child in childs)
{
    obj = otherObj.GetComponent<Transform>().gameObject;
    //do something with obj
}

foreach(GameObject child in child2)
{
    obj = otherObj2.GetComponent<Transform>().gameObject;
    //do something with obj
}

2 个答案:

答案 0 :(得分:1)

两种方法的GC应力是相同的。罪魁祸首不是obj而是foreach。如果使用for进行迭代,则可以在没有任何内存分配的情况下执行此循环:

for(int i = 0; i < transform.childCount; i++){
        GameObject obj = transform.GetChild(i).GetComponent<Transform>().gameObject;
        //do something with obj
    }

答案 1 :(得分:0)

在循环外声明obj gameObject会更有效,因为不再在循环的每次迭代中都重新创建变量。

自从Unity 5.5(foreach GC分配问题)以来,常见集合已得到解决,因此List<T>之类的集合不再分配,因此无需使用for

另一项调整是更改以下内容:

obj = otherObj.GetComponent<Transform>().gameObject;

收件人:

obj = otherObj.gameObject;

gameObjecttransform都可用作从MonoBehaviour派生的任何类的属性。