I’ve written some code that creates a bunch of star effects, and what I think will free them up for garbage collection when I’m done with them.
When I destroy them individually, my ram usage holds a steady 51%, just slightly above a blank frame.
When I let them build up, till ram usage is at 68% or so, however, and delete them all at once, the ram usage goes down to 62%, a significant difference.
So my questions are these:
- Am I freeing all the objects/references/listeners ect. properly and allowing them to be GC’d? Or do I have a memory leak?
- Is there anything else wrong with the way I’ve written the code?
Main Timeline: Frame 1
stop();
import flash.display.*;
import flash.events.Event;
import flash.filters.BlurFilter;
import flash.filters.GlowFilter;
import Preloader.plLoadingBar;
import Preloader.plSpeedLoader;
import Preloader.plSpeedLoaderBall;
import Preloader.Loading;
import Effects.starEffect;
stage.showDefaultContextMenu = false;
var plStarEffectArray:Array = new Array() //an array to hold the star instances' IDs in
var newEnterFrameFunction:Function = function onenterframe():void { //anon function (so onEnterFrame can be used in frame 2, 3 ect.)
for(var aaa:Number = 0; aaa < 200; aaa++) {
var star:starEffect = new starEffect(plStarEffectArray.length); //create a new star
addChild(star);
star.x = Math.random()*520-10;
star.y = 640-70;
plStarEffectArray.push(star); //put it into the array
star = null; //delete the reference
}
}
addEventListener(Event.ENTER_FRAME, newEnterFrameFunction); //add the listener for the anon function
function destroy_starEffect(starID:Number = 0, NUKE:Boolean = false):void {
if(NUKE == false) {
plStarEffectArray[starID].destroy();
removeChild(plStarEffectArray[starID]);
plStarEffectArray[starID] = null;
} else {
for(var i:Number = 0; i <= plStarEffectArray.length-1; i++) {
if(plStarEffectArray* != null){
plStarEffectArray*.destroy(); // systimatically remove references, listeners, filters from stars
removeChild(plStarEffectArray*); //kill the stars
plStarEffectArray* = null;
}
}
plStarEffectArray = null;
}
}
function CleanUp():void {
removeEventListener(Event.ENTER_FRAME, newEnterFrameFunction);
destroy_starEffect(0,true);
}
Class starEffect
package Effects {
import flash.display.*;
import flash.filters.GlowFilter;
import flash.filters.BlurFilter;
import flash.events.Event;
public class starEffect extends MovieClip {
var size1:Number;
var colour:Number;
var str:Number;
var size2:Number;
var speed:Number;
var myID:Number;
var glow:GlowFilter;
var blur:BlurFilter;
public function starEffect(idNum:Number) {
myID = idNum;
if(Math.round(Math.random()*3) == 1) {
size1= (Math.random()*14)+1;
size2 = (Math.random()*2)+0.25;
scaleX=size2;
scaleY=size2;
str = (Math.random()*10)+5;
if(Math.round(Math.random()*3) == 1) {
colour = (Math.random()*16777215);
} else {
colour = 16777215;
}
speed = (Math.random()*5)+3;
} else {
colour = 16777215;
size1= (Math.random()*5)+1;
size2 = (Math.random()*0.8)+0.15;
scaleX=size2;
scaleY=size2;
str = (Math.random()*7)+3;
speed = (Math.random())+0.5;
}
glow = new GlowFilter(colour,1,size1,size1,str,3,false,false);
blur = new BlurFilter(size2+1,size2+1,3);
filters = [glow, blur];
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(event:Event):void {
if(y > 650 || y < 200){
speed = -speed;
}
y += speed;
}
public function destroy():void {
removeEventListener(Event.ENTER_FRAME, onEnterFrame);
glow = null;
blur = null;
filters = null;
}
}
}