My team has been building an application that's graphically heavy. The heaviest portion consists of two sprites that are ~4000x4000 pixels and have a bunch of sprite children and ~20 bitmaps each. The content ends up being ~30 MB for both sprites total, give or take 20 MB. When it's time to switch to new sprites with new content we make sure there are no more references to the two old sprites. I've verified that garbage collection does clean up the old content each time and memory stays about even. However, quite commonly (maybe 1 out of 3 times) when switching to two new sprites the Flash Player will crash. I have good reason to believe it's the act of garbage collection that is causing this crash. Here's why:
(1) If I'm in the Flex Profiler and I've switched to two new sprites and then I hit "run garbage collection" it will sometimes crash right at that moment.
(2) If I use Grant Skinner's posted hack of forcing garbage collection it will sometimes crash right when the garbage collection is forced.
(3) If I keep a reference to all the old sprites (so garbage collection won't collect them) it doesn't crash even after switching to new sprites over 25 times, however the application uses more and more memory.
Can someone provide some enlightenment as to how we proceed? We don't want the application crashing frequently but we also don't want to hog the user's memory (and eventually cause a crash anyway). Making the sprites smaller is an obvious route but one of the last routes we want to take because they're that large for a reason.
Thanks. We appreciate any help offered!
First, you should file a bug.
Second, try re-using the display objects. Recycling is good for the environment, even in Flex.
Flex SDK Developer
Adobe Systems Inc.
Thanks for the response. I've filed a bug. Re-using the display objects in our case will be pretty tricky but that's an idea. Any other tips are appreciated.
Maybe the tricky part can be simplified by having each 'object' be two objects, with a flag to say which one is currently displayed. when you need to load a new graphic for that display object, load it into the 'inactive' one, then switch the flag. This would eliminate garbage collection, but limit you memory useage to only 2x that needed, instead of endless.