在Unity3D中,当在嵌套的foreach(类似嵌套的FOR)中使用if-else时,我获得了更好的性能,而不是在内部使用第3级嵌套foreach。
问题在于,我认为编写代码,如下所示,并不是编写代码的正确和/或优化方式。
foreach(GameObject element in all_elements_on_screen)
{
foreach(Transform child in element.transform)
{
if (child.GetComponent < SpriteRenderer > ().sprite == TileA || child.GetComponent < SpriteRenderer > ().sprite == TileB ||
child.GetComponent < SpriteRenderer > ().sprite == TileC || child.GetComponent < SpriteRenderer > ().sprite == TileD ||
child.GetComponent < SpriteRenderer > ().sprite == TileE || child.GetComponent < SpriteRenderer > ().sprite == TileF ||
child.GetComponent < SpriteRenderer > ().sprite == TileG || child.GetComponent < SpriteRenderer > ().sprite == TileH ||
child.GetComponent < SpriteRenderer > ().sprite == TileI || child.GetComponent < SpriteRenderer > ().sprite == TileJ ||
child.GetComponent < SpriteRenderer > ().sprite == TileK || child.GetComponent < SpriteRenderer > ().sprite == TileL ||
child.GetComponent < SpriteRenderer > ().sprite == TileM || child.GetComponent < SpriteRenderer > ().sprite == TileN ||
child.GetComponent < SpriteRenderer > ().sprite == TileO || child.GetComponent < SpriteRenderer > ().sprite == TileP ||
child.GetComponent < SpriteRenderer > ().sprite == TileQ || child.GetComponent < SpriteRenderer > ().sprite == TileR ||
child.GetComponent < SpriteRenderer > ().sprite == TileS || child.GetComponent < SpriteRenderer > ().sprite == TileT) {
Destroy(child.GetComponent < PolygonCollider2D > ());
}
else
{
child.gameObject.AddComponent < PolygonCollider2D > ();
}
}
}
因此,我通过创建另一个嵌套的foreach循环来整理(使其更优化?)代码:
foreach(GameObject element in all_elements_on_screen)
{
foreach(Transform child in element.transform)
{
foreach(Sprite crater_texture in textures_craters)
{
if (child.GetComponent < SpriteRenderer > ().sprite == crater_texture)
{
Destroy(child.GetComponent < PolygonCollider2D > ());
}
else
{
child.gameObject.AddComponent < PolygonCollider2D > ();
}
}
}
}
这两个片段都做了完全相同的事情,除了后一段代码比前一段需要更多的时间来加载/运行。为什么会这样?有没有其他方法来优化这段代码,以便它运行得更快?
答案 0 :(得分:3)
您提供的功能不相同。第一个检查相等性并调用Destroy()
或AddComponent
一次。后者多次调用中的一个,因为它在foreach循环中。
textures_crater
是什么类型的?您是否可以使用默认方法检查数组/列表中是否有crater_texture
,然后决定该怎么做?
例如,如果是List,您可以这样做:
foreach(GameObject element in all_elements_on_screen)
{
foreach(Transform child in element.transform)
{
if (textures_craters.Contains(child.GetComponent<SpriteRenderer>().sprite)
{
Destroy(child.GetComponent<PolygonCollider2D>());
}
else
{
child.gameObject.AddComponent<PolygonCollider2D>();
}
}
}
如果出于某种原因,textures_craters
是一个奇怪的容器,你不能使用这种Contains方法,你总是可以使用一个帮助器布尔值,循环遍历它并确定该元素是否在容器中,并且之后再调用一种或另一种方法。
答案 1 :(得分:1)
第二种情况强制对texture_craters中的每个项进行迭代。第一种情况只运行您的条件,直到它遇到一个真实条件然后它可以停止,因为只要一个子条件为真,||
短路(||
为真)。 / p>