Utilice la agrupación de objetos siempre que sea posible.
Otra optimización importante se denomina agrupación de objetos e implica la reutilización de los mismos en el tiempo. Durante la inicialización de la aplicación se crea un número definido de objetos que se almacenan dentro de un grupo como, por ejemplo, un objeto Array o Vector. Una vez que se ha terminado con un objeto, se puede desactivar para que no consuma recursos de CPU y se eliminan todas las referencias a otros objetos. Sin embargo, no se establecen las referencias a
null
, lo que podría hacerlo adecuado para la recolección de elementos no utilizados. Sólo es necesario volver a situar el objeto en el grupo y recuperarlo cuando se necesite un nuevo objeto.
Con la reutilización de objetos se reduce la necesidad de crear instancias de objetos, lo cual puede resultar costoso. Asimismo, se reducen las posibilidades de ejecución del recolector de elementos no utilizados, que puede ralentizar la aplicación. El siguiente código muestra la técnica de agrupación de objetos:
package
{
import flash.display.Sprite;
public final class SpritePool
{
private static var MAX_VALUE:uint;
private static var GROWTH_VALUE:uint;
private static var counter:uint;
private static var pool:Vector.<Sprite>;
private static var currentSprite:Sprite;
public static function initialize( maxPoolSize:uint, growthValue:uint ):void
{
MAX_VALUE = maxPoolSize;
GROWTH_VALUE = growthValue;
counter = maxPoolSize;
var i:uint = maxPoolSize;
pool = new Vector.<Sprite>(MAX_VALUE);
while( --i > -1 )
pool[i] = new Sprite();
}
public static function getSprite():Sprite
{
if ( counter > 0 )
return currentSprite = pool[--counter];
var i:uint = GROWTH_VALUE;
while( --i > -1 )
pool.unshift ( new Sprite() );
counter = GROWTH_VALUE;
return getSprite();
}
public static function disposeSprite(disposedSprite:Sprite):void
{
pool[counter++] = disposedSprite;
}
}
}
La clase SpritePool crea un grupo de objetos nuevos cuando se inicia la aplicación. El método
getSprite()
devuelve instancias de estos objetos y
disposeSprite()
las libera. El código permite que el grupo crezca cuando se ha consumido por completo. También es posible crear un grupo de tamaño fijo donde los nuevos objetos no se asignen cuando el grupo esté agotado. Intente evitar la creación de nuevos objetos en bucles, si es posible. Para obtener más información, consulte
Liberación de memoria
. En el siguiente código se utiliza la clase SpritePool para recuperar nuevas instancias:
const MAX_SPRITES:uint = 100;
const GROWTH_VALUE:uint = MAX_SPRITES >> 1;
const MAX_NUM:uint = 10;
SpritePool.initialize ( MAX_SPRITES, GROWTH_VALUE );
var currentSprite:Sprite;
var container:Sprite = SpritePool.getSprite();
addChild ( container );
for ( var i:int = 0; i< MAX_NUM; i++ )
{
for ( var j:int = 0; j< MAX_NUM; j++ )
{
currentSprite = SpritePool.getSprite();
currentSprite.graphics.beginFill ( 0x990000 );
currentSprite.graphics.drawCircle ( 10, 10, 10 );
currentSprite.x = j * (currentSprite.width + 5);
currentSprite.y = i * (currentSprite.width + 5);
container.addChild ( currentSprite );
}
}
El siguiente código elimina todos los objetos de visualización de la lista de visualización cuando se hace clic en el ratón y, posteriormente, se reutilizan para otra tarea:
stage.addEventListener ( MouseEvent.CLICK, removeDots );
function removeDots ( e:MouseEvent ):void
{
while (container.numChildren > 0 )
SpritePool.disposeSprite (container.removeChildAt(0) as Sprite );
}
Nota:
el vector del grupo siempre hace referencia a objetos Sprite. Si desea eliminar el objeto de la memoria completamente, sería necesario disponer de un método
dispose()
en la clase SpritePool, lo que podría eliminar todas las referencias restantes.