Foreach& FOR循环效率与if-else

时间:2015-05-10 05:31:27

标签: c# if-statement for-loop foreach unity3d

在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 > ();
          }
        }
      }

    }

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

2 个答案:

答案 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>