Mucha gente tiene problemas a la hora de eliminar elementos de un array, y más si el mismo se está recorriendo frame a frame.
Uno de los problemas más grandes que veo es de lógica. Muchos tienen una lógica para eliminarlos más o menos así:
En JavaScript/ActionScript:
for(var i:int=0; i<myArray.length; i++) { if(myArray[i] == algoQueHagaQueSeElimine) { myArray.splice(i, 1); } }
En C#:
for(int i=0; i<myArray.length; i++) { if(myArray[i] == algoQueHagaQueSeElimine) { myArray.RemoveAt(i); } }
El problema está en que si en el medio de un for eliminamos un índice, nos vamos a quedar con un elemento SIN COMPROBAR. Esto pasa porque al eliminar un elemento, todo el array se acomoda nuevamente. El hueco que falta se rellena con el elemento siguiente, o sea que todos los elementos restantes “retroceden” una casilla. Veamos un ejemplo y la solución:
Hay que tener en cuenta que al momento de eliminar elementos dentro de un bucle, si le estamos diciéndo a dicho bucle que vaya hasta la cantidad máxima de elementos dentro del array, a medida que vayamos eliminándolos este valor se irá haciendo más pequeño. Los mismo pasa si agregamos elementos, pudiendo provocar así un bucle infinito.
Por esto y por algunos temas de performance, es conveniente hacer un bucle al revés. El tema de la performance lo voy a subir en algún momento a un post sobre mitos y verdades. En algunos lenguajes, realmente no hay impacto si el bucle es al revés o no. Pero en otros se nota bastante la diferencia. Más que nada porque se comprueba que el bucle llegue al final con un número, en lugar de con una variable, y en algunos lenguajes lo que consume de más es el modo en el cual el mismo lenguaje opta para saber el valor de una posición de memoria.
Saludos!