Actionscript 3 :: Memory Management When Instantiating Extended Classes?
May 16, 2010
I'm developing an AS3 application which has some memory leaks I can't find, so I'd like to ask some newbie questions about memory management.Imagine I have a class named BaseClass, and some classes that extend this one, such as ClassA, ClassB, etc.I declare a variable:
myBaseClass:BaseClass = new ClassA();
After a while, I use it to instantiate a new object:
myBaseClass = new ClassB(); some time after
myBaseClass = new ClassC();
and the same thing keeps happening every x millis, triggered by a timer.Is there any memory problem here? Are the unused instances correctly deleted by the garbage collector?
I'm making an isometric game and I need to know which takes less memory for scrolling, making everything invisible that you can't see? Like if(!this.base.hitTest(worldHitter))this._visible = false; Or would it be better to remove the movieclips unseen and then reattach them when i should see them?
The examples I'll use don't do anything - they're classes without ANY members - no variables, methods, anything.
Let's say I extends Sprite and call it MySprite.
I save it in test.core
[code]...
Now I create another custom class called MyWindow that extends MySprite.
I save it in test.windows
[code]...
Then I create another class that extends MyWindows (the example I'll use is a document class - but that doesn't matter - I've tested using an instance too).
[code]...
Notice that I'm not even trying to instantiate the helper classes - just having them there throws the error.
If there is only a single helper class, everything runs fine.
Also note that - as far as I can tell - this only happens when extending one class from another package, then extending that class with more than one helper object.I'm pretty sure there's no namespace bumps or typographical errors, as this is a very pared-down version of the original application.
EDIT: seems the problem exists even without the crossing packages - even extending MySprite in the document class with multiple internal classes generates this error.
I previously asked about some FLV files that I was loading externally, and having trouble with memory being released. Having sort of solved this, I am having the same problem with loading external resources and then getting them to be cleared out of memory when I'm done with them. I have seen kglad mention more than once that GC in flash 9.0.124.0 is broken, but where does that leave us? I have also tried my project in FP 10, and the memory still continues to go up and up. If I load an external resource - in this case I have a class that builds a VR room with papervision - and then close it, set it's instance to null, my memory never goes down.
This is a total guess, but could it have anything to do with using Tweener in my project? Is there any way that the Tweener class could be keeping some of my objects in memory and keep them from being GC'd? I am using weak references in my listeners, setting any variable I can find to null... I can get over how frustrating this is to just see memory go up and up but find no reason. The class I am using also uses a few subclasses to build itself, but I end up with one instance of my VR on the stage. If I have set that instance to a name - myVR - and then removeChild(myVR) from the stage and set the name to null - that should do it right? Boy, this is frustrating.
I have done a lot of searching / reading to find out how to clear my memory. But I still can't really work out how to clear the memory, it just never seems to come down. I have a few MovieClips that contain other MovieClips with pngs inside them being added to the stage.
As fare as I can tell all Event listeners are removed and refrences I remove the clip, with removeChild I "null" the variable I am using the "LocalConnection()" hack to try and force a clean up, but no movement on the memory count. Are there any examples of a *.png being added and removed from the memory?
I was recently profiling my application that uses Degrafa States in the skins and noticed that doing so uses more memory than I expected. Between the SetProperty and State, they were using about 10% of the total used application memory.
Would it be better to use css for the state changes and a new skin for each state? or Are there some simple tips to reducing the memory footprint of degrafa?
the Flash Virtual Machine relies on garbage collection by using reference counting and mark and sweep (for good coverage of these topics, check out Grant Skinner's article and presentation). And yes, Flash also provides the "delete" operator, which can (unfortunately only) be used to remove the properties of dynamic objects.
What I want to know is how to make it so that Flash programs don't continue to consume CPU and memory while running in the background (save loading content or communicating remotely, for example). The motivation for this question comes in part from Apple's ban on cross compiled applications (in its SDK 4) on the grounds that they do not behave as predicted with the multitasking feature central to iPhone OS 4. My intention is not only to make Flash programs that will 'pass muster' as far as multitasking in iPhone OS 4, but also to simply make better (behaving) Flash programs.
Put another way, how might a Flash application mimic the multitasking feature of iPhone OS 4? Does the Flash API provide the means for a developer to put their applications to 'sleep' while other programs run, and then to 'awaken' them just as quickly?
In our own program, we might do something as crude as detecting when the user has been idle (no mouse motion or key press) for (say) four seconds:
var idle_id:uint = setInterval(4000, pause_program); var current_movie_clip:MovieClip; var current_frame:uint;
[code]....
what's the best way to detect that an application should be shelved? And, more importantly, is it possible for Flash Player to detect that some of its running programs are idle, and to similarly shelve them until the user performs an action to resume them?
I am a flex programmer but i had nothing to do for handle manage memory in my projects. I think lack of memory management is reason for loading lag of swf file. Can any one help me to how to handle manage memory in flex/ as3 codes.
I've been trying to figure out how Flash does its memory management regarding object declarations but haven't found anything that describes declarations themselves. [code]Basically I want a pool of declared variables that get instantiated only when a certain type is set. I'd have logic in other functions that figures out what the type is and then does certain things to it, but for now I just wanted to know what kind of memory management Flash does with something like this. Does it do nothing until I actually instantiate it (= new Object()) or will space be set aside once I simply declare it (someObj:Object)?
In AS3, after I've removed a display object container B from another display object container A and deleted all the references to B in A, does that mean that all memories previously held in B will all be released too or do I have to manually delete all the references to objects in B before I can delete B in A in order to free all the memory space held?One more question. I was kind of confused of when to use the delete statement and when to set a variable to null.
Hi guys, I'm wondering whether any of you have any opinions on whether you instantiate a Loader into an instance variable, or whether you declare a local variable to hold the Loader object.
I'm coming at this from a memory management / garbage collection perspective.
I only need the Loader object to load the file and register the event listeners. So I don't really want an object-wide instance variable to hold this loader object (which is what Adobe does in most of their examples), since I can always access the loader.data through the event's target property.
This blog (and others) state that you should set object references to null inside your dispose() methods when cleaning up objects. However, Actionscript 3 (with Flash Player 9) uses mark and sweep to clear out circular references for you. So I am wondering: is there really any reason to null out your object references?
i've been struggling with one problem for weeks, and i've just found what i think is a possible cause (or at least a contributing factor)
This line:
Code: var totalOffset:Point = rangedWeaponData.totalOffset;
What i thought it was doing is creating a copy of a static variable, for me to manipulate. However my debugging seems to show so far that it's actually creating a reference, and my subsequent manipulation of that is also manipulating the base variable it references.
Code: var totalOffset:Point = new Point(rangedWeaponData.totalOffset);
My AS3 application basically does the following (pseudo code from main application class) 3 or 4 times by adding custom objects to stage:
_movieClipClassVariable = new MyCustomSpriteSubclass(); _movieClipClassVariable.addEventListener(MyEvents.READY, function(event:Event):void { _hideLoading(); mcHolder.addChild(_movieClipClassVariable);}); _movieClipClassVariable.addEventListener(MouseEvent.CLICK, myClickHandler); private function coverClickHandler(event:Event):void { }
What is the right way to allow Garbage Collector to recycle _movieClipClassVariable after it is not necessary? Assign null to it? Remove all listeners? Use weak reference for listeners?
I have a question regarding AS3 memory management. Supposing I created an instance variable for a Class, in this case or type Sound: public class SoundStore extends Sprite{ var s:Sound; Then within various class functions I referenced this variable multiple times, each time I wanted to load in a new sound: s = new Sound(); Am I correct in thinking that each time I created a new Sound I would be overwriting the previous allocated memory?
I am having an issue where I cannot use my own classes in CS3. When I try to create an instance of one class inside another class, from within the same package like this:
var t:myClass = new myClass();
gets me 1067: Implicit coercion of a value of type myClass to an unrelated type Class.
The constructor for the class is simply:
public function myClass():void { this.isactive = false; }
I'm kind of messy and I ussually change the class linkage name a lot .
What happens with unused anymore linkage classes ? Are they automatically deleted by flash CS3 IDE ?
Edit:Long time no answer What I mean is not if they are still available (haven't tested but probably aren't) , what I mean is will those linkage classes be compiled into swf increasing the size or not ?
I have this problem from time to time with AS3 where I extend a Class and then try call methods and variables which are public from the new class but I get errors that method or variable doesn't exist. My IDE recognises the methods and variables though.[code]When I run the script flash hates it. I thought when you extend a class it was supposed to inherit its properties and methods?Does anyone else have these problems? I shouldn't have to cast it as Box. I swear I have this working in a project but cant see the different in setup?
I use Flash Professional CS5.5 with Gaia FrameWork in my project. movieclips in the project have extended classes and the problem is that when I give new functionality to my classes they doesn't work in an build project. for example function s cann't be found, trace doesn't work and so on. All the old functionality works. When I change class name then it works fine. but then it happens again. I made new project and coped all the content, but still it happens. I event rainstalled flash but nothing works.
Im building a project using an MVC pattern. I have (pseudo) abstract classes Model and View, each extended with particular models and views. But I cannot access properties on the extended classes of Model...Model simply distributes XML data, heres its constructor:
Code: public function Model(data:XML) { _data = data; /*_data is a protected var of type XML in Model*/ }
MainModel extends Model, and has a property called _background of type Background which also extends Model:
Code:
private var _background:Background = new Background(some XML source); public function MainModel(data:XML) {
[code]....
The problem arises when I try to pass MainModel's background property as a parameter of _bgView (highlighted in red above). The compiler says there is no background property on Model, which is true, but I need it to look at its extended class MainModel, not Model. I've typed MainView's constructor parameter with MainModel, but it is still seeing it as Model.
Im building a project using an MVC pattern. I have (pseudo) abstract classes Model and View, each extended with particular models and views. But I cannot access properties on the extended classes of Model...Model simply distributes XML data, heres its constructor:
package { import flash.display.Sprite; public class MySprite extends Sprite{
[Code]....
and extend that class, if more than one internal classes are defined:
package { public class MainClass extends MySprite { public function MainClass():void{}
[Code]....
ReferenceError: Error #1065: Variable MainClass is not defined.Note that this only happens (as far as I can tell) when the public class of the package extends another class, and multiple internal classes are defined. The internal classes don't even need to be instanced or referenced to generate the error (the bare-bones code above will error out). If only a single internal class is defined, it works fine (no error). Even if the internal class is instanced.
I have created a few Event and Command classes for use in my Cairngorm projects.For example, I created an class that extends URL... that allows me to set callback functions upon completion or failure of the corresponding Command. To accomplish this, I also had to create a new Class that implements com.adobe.cairngorm.commands.ICommand that I extend for all Commands in my projects.Now, I want to use these two classes across all of my Cairngorm applications. What is the best way to do this? Should I just edit the Cairngorm source for CairngormEvent and ICommandand recompile the Cairngorm MVC (is that even possible)? Or add my two classes to the Cairngorm source and recompile the Cairngorm MVC? Or should I just add them to a shared library?I've chose the third option for now, but this requires that I reference the Cairngorm library in both my library and each project. I am wondering if there is a better practice and what the benefits are.
my understanding is that primitive types (uint, string, Number, etc.) of a class do not need to be set to null for garbage collection.
for example, i am not required to write this dispose() method in the following class:
package { //Imports import flash.display.Shape;
[Code]....
if this is true, which i believe it is, what is the difference between objects of primitive types and objects of non primitive types concerning memory allocation?
I have a flv player that seems to only work in IE and not FF?? The player works fine in the flash authoring environment. Since it does work in a browser, that eliminates its being a sandbox problem.
Does anyone know if flash loading js classes into the container browser memory?
I have a class just full of random STATIC functions and vars that I use often on alot of other classes. things like the classic randRange(min, max) function. . just silly things i dont want cluttering my code My question is does importing this class into other classes increase the memory used by instances of the class. Cause i may import this class of 30 objects and only use 2 of them. I'm thinking it doesn't. But i could be wrong as I haven't found much material on flash memory usage other than garbage collector stuff.
I have 1 class (that is extending a UIcomponent) that is representing a component. In that component I create different instances of another class that is also a UIComponent but this class doesn't show up in de first class. I see that it is running and that it has the correct hights but I got the feeling that it doesn't show up with this hights. If I trace I see the width and height is 200 X 200 but there is still nothing visible in my component.
I have a bit trouble with LoaderMax memory occupy, i have a queue, and i am keep loading images depend on user's action. if they click load more and it keep load, but i would like to clean the memory which been occupied by the previous queue (i have remove all the children been added by the loading previously). is there a way i can do it? the behavior like this.
I have an FPS monitor running and notice that I am getting choppiness here and there, bringing my game from 40 to 27 fps and back and forth at certain stages. I have an idea of where it is happening, but do not know for sure. I looked up quite a few memory monitors but haven't found anything decent yet. Is there a memory monitor that allows you to see the memory leaked and find its location? If not, how about just he memory leaked?