哪种方法优化内存还是相同?
方法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
}
答案 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;
gameObject
和transform
都可用作从MonoBehaviour
派生的任何类的属性。