As you may know, since Flash Player 8 thanks to the BitmapData class, you are able to create a single BitmapData instance and reference it through multiple instance of the Bitmap class, this way you are reusing the BitmapData instance without recreating it.

In the following code, we are not reusing the BitmapData class, but we are creating for each iteration and new BitmapData instance which is very costly in memory :

var sourceImage:BitmapData;
var imageContainer:Bitmap;
for ( var i:int = 0; i< 300; i++ )
{
sourceImage = new BitmapData (20, 20, false, 0xF0D062);
imageContainer = new Bitmap ( sourceImage );
addChild ( imageContainer );
imageContainer.x = ( imageContainer.width + 8 ) * Math.round (i % 20);
imageContainer.y = ( imageContainer.height + 8 ) * Math.floor (i / 20);
imageContainer.z = Math.random()*1000;
imageContainer.alpha = Math.random();
imageContainer.scaleX = imageContainer.scaleY = Math.random();
imageContainer.rotation = Math.floor ( Math.random()*360 );
imageContainer.alpha = Math.random();
}

Result :

A Flash animation should have appeared here, but it seems that your browser has an older version of the Flash Player or it is not installed at all. Please, install the last release of the Flash Player now, then reload this page.

The code above cost around 600kb in memory. Now here is a way to get the exact same result but only cost 90kb in memory, thanks to the first line of code :

var sourceImage:BitmapData = new BitmapData (20, 20, false, 0xF0D062);
var imageContainer:Bitmap;
for ( var i:int = 0; i< 300; i++ )
{
imageContainer = new Bitmap ( sourceImage );
addChild ( imageContainer );
imageContainer.x = ( imageContainer.width + 8 ) * Math.round (i % 20);
imageContainer.y = ( imageContainer.height + 8 ) * Math.floor (i / 20);
imageContainer.z = Math.random()*1000;
imageContainer.alpha = Math.random();
imageContainer.scaleX = imageContainer.scaleY = Math.random();
imageContainer.rotation = Math.floor ( Math.random()*360 );
imageContainer.alpha = Math.random();
}

Result :

A Flash animation should have appeared here, but it seems that your browser has an older version of the Flash Player or it is not installed at all. Please, install the last release of the Flash Player now, then reload this page.

Here, a single BitmapData instance is used and shown through the multiple Bitmap instances. The Bitmap instances are acting as screens and as soon as you update the BitmapData source, everything is updated, simple and efficient :

stage.addEventListener ( MouseEvent.CLICK, changeColor );

function changeColor  ( e:MouseEvent ):void
{
sourceImage.fillRect ( sourceImage.rect, Math.random()*0xFFFFFF );
}

Which gives the following result (click to change color) :

A Flash animation should have appeared here, but it seems that your browser has an older version of the Flash Player or it is not installed at all. Please, install the last release of the Flash Player now, then reload this page.

Now, why do I talk about this ? Well, the concept of having a single reference and being able to reference it and show it is great, first for memory optimization but also in terms of simplicity of coding.

What would be great is having the same feature as we have here for BitmapData but for traditional DisplayObjects. Flash Player 9 introduced the concept of reparenting, which means that if you call the addChild method and pass a DisplayObject which is already nested in a container, calling such a method will make it leave it's original container to get into the new one. This feature is great, but what could be even nicer is a way to allow the developer to say : Hey, this time please don't reparent this DisplayObject, just show it in the new container just like the Bitmap class does with BitmapData. Like BitmapData, if the original DisplayObject is modified (stopped, rotated, etc) everything is updated.

In a game, let's say you have a wall made of stars, currently what you would have to do is instanciate as much as stars as you need to create the wall, or better, create a rasterized version of the star movieclip using BitmapData instances and emulate the MovieClip through Bitmap instances referencing the BitmapData frames, but BitmapData.draw() does not allow you to capture also nested animations in MovieClip on each frame, and some other problems would be hard to deal with, as a result this could be made easier if implemented natively.

To resume, the idea is to have different instances (enveloppes) hosting a single and unique content represented by a DisplayObject behaving as the source.

It would be really nice to have this in the Flash Player, if you like the idea please vote for this feature !
This could make it happen one day ! :)