Posts Tagged ‘AS3’
Flash Image Sequence Memory Issues
April 9th, 2009 • 3 comments ActionScript, Flash
Tags: ActionScript, AS3, BitmapData, Flash
I guess most of you are aware of the Bitmap memory leak in Flash Player and that you have to call the BitmapData.dispose() method to actually free the memory. But what to do if you don’t have a reference to the BitmapData?
That’s essentially a problem when dealing with MovieClips with an image sequence on its timeline. After adding the MovieClip to the stage and accessing each frame the complete sequence is in memory and removing it from the stage again doesn’t free any of this memory. Obviously the single frames are getting converted to Shapes with bitmap fill internally, so you don’t have a Bitmap instance for each frame and therefore you can’t dispose the frames after showing the sequence.
Sequence Example (the swf has no preloader, so you’ll probably have to wait a little bit)
Sequence Example Source (9MB, Flash CS3)
The only solution for this problem is to load the sequence as an external swf and call the unload method of your Loader instance when you don’t need the sequence anymore and want to free the memory. Alternatively you could load the single jpg frames individually, create your sequence programmatically and use BitmapData.dispose() afterwards.
Using a timeline animation as alpha mask
March 15th, 2009 • 1 comment ActionScript
Tags: ActionScript, Add new tag, AS3, Flash
I guess you know, that you have to set the cacheAsBitmap property of both, the mask and the masked Sprite, to apply an alpha mask.
... mask.cacheAsBitmap = true; container.mask = mask; container.cacheAsBitmap = true; ...
This works perfectly with a static bitmap mask but if you try to do the same with an animated MovieClip mask, the mask will not work anymore. Apparently the cacheAsBitmap property of the MovieClip is reset on entering a new frame and therefore to get it working you have to set cacheAsBitmap = true in every frame.
... mask.cacheAsBitmap = true; container.mask = mask; container.cacheAsBitmap = true; addEventListener(Event.ENTER_FRAME, frameHandler); function frameHandler(event : Event) : void { mask.cacheAsBitmap = true; } ...
Masking a 3D Container in AS3 (FP10)
February 16th, 2009 • 8 comments ActionScript, Flash
Tags: AS3, Flash
»Easily transform and animate any display object through 3D space while retaining full interactivity.« That’s one of the key features in FlashPlayer 10 according to Adobe. You might think: "Woohoo, that’s fantastic" … so did I. But actually this is not completely true.
I was trying to set a mask or the scrollRect-property of a Sprite and as long as you don’t use one of the new 3D properties (rotationX, rotationY, rotationZ, …) this works as supposed. After changing one of the 3D properties and therefore using the new 3D API the mask will not work anymore. Of course this is not mentioned in the FP10 AS3 reference.
Digital Graffiti – Spray Demo
December 19th, 2008 • 6 comments ActionScript, AIR, Flash, Physical Computing, Projects
Tags: ActionScript, AIR, Arduino, AS3, Physical Computing, RFID
The canvas with the van is not very nice, but just to show you a demo of the spray can. sorry for my bad spraying skills. see a description of the project here.
BitmapData.draw() is limited to 4096px
December 11th, 2008 • 8 comments ActionScript, AIR, Flash
Tags: ActionScript, AIR, AS3, BitmapData, Flash
Thanks to Jens I figured out another limitation in the BitmapData class. It’s actually buried in the draw() method which doesn’t copy any pixels to the BitmapData object whose target x-/y-position is greater than 4096px (0×1000). You don’t get any error just the pixels won’t be copied. This behavior is the same in FlashPlayer 9 and 10 and of course AIR 1.0 – 1.5.
Actually this is no problem for the regular use of BitmapData in FP9 because the BitmapData size is limited to 2880x2880px but using my BitmapDataUnlimited Class and trying to snapshot a Sprite wider or higher than 4096px won’t end up in your desired result.
As you probably know Adobe changed the BitmapData limit in FP10 to a more flexible one, so you are not limited by a specific size anymore but a maximum pixel count of 16,777,215. This means that you can have a BitmapData up to 8191x2048px without using BitmapDataUnlimited but interestingly you can’t draw a Sprite with the same size to this BitmapData object. I think Adobe forgot about their own secret, undocumented »feature«.
example
Sprite: w=8191, h=2048
FP10 BitmapData: w=8191, h=2048 with snapshot of the Sprite
workaround
A workaround for that problem would be to draw everything directly to the BitmapData or if you have to snapshot a Sprite greater than 4096px you could draw it to 4096px BitmapData chunks and copy them to the huge BitmapData afterwards using copyPixels().
Update December 14th, 2008
I added a draw method to the BitmapDataUnlimited class to bypass the 4096px limit.

