gpt4 book ai didi

c# - Foreach 和 FOR 循环效率 vs if-else

转载 作者:行者123 更新时间:2023-11-30 20:43:45 30 4
gpt4 key购买 nike

在 Unity3D 中,当在嵌套的 foreach(类似地嵌套 FOR)中使用 if-else 而不是在内部嵌套第三层 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 > ();
}
}
}

}

除了后一段代码比前一段代码需要更多时间来加载/运行之外,这两个片段都做完全相同的事情。为什么会这样?有没有其他方法可以优化这段代码以使其运行得更快?

最佳答案

您提供的功能不相等。第一个检查相等性并调用 Destroy()AddComponent 一次。后者多次调用,因为它在 foreach 循环内。

textures_crater 是什么类型?您是否愿意使用默认方法检查 crater_texture 是否在数组/列表/任何内容中,然后决定要做什么?

例如,如果它是一个列表,你可以这样做:

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 方法,您总是可以使用辅助 bool 值,遍历它并确定元素是否在容器,然后相应地调用一个或另一个方法。

关于c# - Foreach 和 FOR 循环效率 vs if-else,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30148074/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com