• Flash Optimization – Freeing Memory

    Flash optimization is becoming increasing important & with alternative development tools that developers can use. We all have a responsibility to build Flash elements that are efficient as much as they are groundbreaking. As someone who feels responsible for the future of this great application, I am creating a Flash Optimization series that will help educate the Flash development community on how to keep their Flash elements as lean as possible.

    You cannot launch the garbage collector directly in the release version of Flash Player. To make sure that an object is garbage collected, delete all references to the object. Keep in mind that the old delete operator used in ActionScript 1.0 and 2.0 behaves differently in ActionScript 3.0. It can only be used to delete dynamic properties on a dynamic object.

    Note: You can call the garbage collector directly in Adobe® AIR® and in the debug version of Flash Player.

    For example, the following code sets a Sprite reference to null:

    
    var mySprite:Sprite = new Sprite();
    
    // Set the reference to null, so that the garbage collector removes it from memory
     mySprite = null;
    

    Remember that when an object is set to null, it is not necessarily removed from memory. Sometimes the garbage collector does not run, if available memory is not considered low enough. Garbage collection is not predictable.

    Memory allocation, rather than object deletion, triggers garbage collection. When the garbage collector runs, it finds graphs of objects that haven’t been collected yet. It detects inactive objects in the graphs by finding objects that reference each other, but that the application no longer uses. Inactive objects detected this way are deleted.

    In large applications, this process can be CPU-intensive and can affect performance and generate a noticeable slowdown in the application. Try to limit garbage collection passes by reusing objects as much as possible.

    Also, set references to null, when possible, so that the garbage collector spends less processing time finding the objects. Think of garbage collection as insurance, and always manage object lifetimes explicitly, when possible.

    Note: Setting a reference to a display object to null does not ensure that the object is frozen. The object continues consume CPU cycles until it is garbage collected. Make sure that you properly deactivate your object before setting its reference to null.

    The garbage collector can be launched using the System.gc() method, available in Adobe AIR and in the debug version of Flash Player. The profiler bundled with Adobe® Flash® Builder™ allows you to start the garbage collector manually. Running the garbage collector allows you to see how your application responds and whether objects are correctly deleted from memory.

    Note: If an object was used as an event listener, another object can reference it. If so, remove event listeners using the removeEventListener()method before setting the references to null.

    Fortunately, the amount of memory used by bitmaps can be instantly reduced. For example, the BitmapData class includes a dispose() method. The next example creates a BitmapData instance of 1.8 MB. The current memory in use grows to 1.8 MB, and the System.totalMemory property returns a smaller value:

    
    trace(System.totalMemory / 1024);
     // output: 43100
    
    // Create a BitmapData instance
     var image:BitmapData = new BitmapData(800, 600);
    
    trace(System.totalMemory / 1024);
     // output: 44964
    

    Next, the BitmapData is manually removed (disposed) from memory and the memory use is once again checked:

    
    trace(System.totalMemory / 1024);
     // output: 43100
    
    // Create a BitmapData instance
     var image:BitmapData = new BitmapData(800, 600);
    
    trace(System.totalMemory / 1024);
     // output: 44964
    
    image.dispose();
     image = null;
    
    trace(System.totalMemory / 1024);
     // output: 43084
    

    Although the dispose()method removes the pixels from memory, the reference must still be set to null to release it
    completely
    . Always call the dispose() method and set the reference to null when you no longer need a BitmapData
    object, so that memory is freed immediately.

    Note: Flash Player 10.1 and AIR 1.5.2 introduce a new method called disposeXML() on the System class. This method
    allows you to make an XML object immediately available for garbage collection, by passing the XML tree as a parameter.

    This entry was posted on Monday, April 11th, 2011 at 3:33 am and is filed under ActionScript, Adobe AIR, Flash, Tutorials. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

    You might also like

    Flash Optimization – Display Objects Flash optimization is becoming increasing important & with alternative development tools that developers can...
    Flash Optimization – Reusing Objects Flash optimization is becoming increasing important & with alternative development tools that developers...
    Flash Optimization – Activate & Deactivate Events Flash optimization is becoming increasing important & with alternative development tools that developers...
    Flash Optimization – Object Pooling Flash optimization is becoming increasing important & with alternative development tools that developers...
  • 0 Comments

    Take a look at some of the responses we've had to this article.

  • Post a Comment

    Let us know what you thought.

  • Name:

    Email (required):

    Website:

    Message: