samedi 9 mai 2015

Foreach & FOR loop efficiency vs if-else

In Unity3D, I'm getting better performance when using if-else inside nested foreach (similarly nested FOR), instead of having a 3rd level nested foreach inside.

The problem is that I thought writing the code, as shown below was not the correct and/or optimized way of writing code.

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

            }
          }
        }

Therefore, I tidied (made it more optimized?) the code by creating another nested foreach loop:

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

    }

Both of these snippets do the exact same thing, EXCEPT the latter piece of code takes more time to load/run than the former. Why is that happening? is there any other way of optimizing this piece of code so it runs faster?

Aucun commentaire:

Enregistrer un commentaire