@colouredfunk I've been a bit busy so I haven't been able to research
this more, but putting it into an external SWF would probably make it
worse. If you have a memory leak, you could potentially get problems
unloading the SWF due to the leaks so it is probably more manageable
as part of the main SWF.

J

On Jun 8, 10:30 am, colouredfunk <[email protected]> wrote:
> After doing more tests, I'm still getting a massive memory leak in
> just destory and replacing 3DS models.
>
> package
> {
>         import away3d.animators.VertexAnimator;
>         import away3d.containers.View3D;
>         import away3d.core.base.Mesh;
>         import away3d.core.base.Vertex;
>         import away3d.core.utils.Debug;
>         import away3d.events.Loader3DEvent;
>         import away3d.events.MaterialEvent;
>         import away3d.loaders.data.AnimationData;
>         import away3d.loaders.data.MaterialData;
>         import away3d.loaders.Loader3D;
>         import away3d.loaders.LoaderCube;
>         import away3d.loaders.Max3DS;
>         import away3d.loaders.Md2;
>         import away3d.loaders.utils.AnimationLibrary;
>         import away3d.materials.BitmapFileMaterial;
>         import away3d.materials.BitmapMaterial;
>         import away3d.materials.WireColorMaterial;
>         import away3d.primitives.Plane;
>         import away3d.core.utils.Cast
>
>         import flash.display.Sprite;
>         import flash.events.Event;
>         import flash.events.MouseEvent
>
>         [SWF(backgroundColor = "#000000", width = "800", height = "600")]
>
>         public class MaxLoadTest extends Sprite
>         {
>
>                 private var _view:View3D;
>
>                 private var _md2:Max3DS
>                 private var _loader:LoaderCube
>                 private var _clickFlag:Boolean = false
>                 public function MaxLoadTest()
>                 {
>                         //Debug.active = true
>                         _view = new View3D();
>                         addChild(_view);
>                         _view.x = 400;
>                         _view.y = 300;
>                         _md2 = new Max3DS();
>                         this.stage.addEventListener(MouseEvent.CLICK, 
> _onMouseClick);
>
>                 }
>
>                 private function _onMouseClick(e:Event):void
>                 {
>                         if (_clickFlag) {
>                                 cleanUp();
>                         } else {
>                                 setUp();
>                         }
>                 }
>                 private function cleanUp():void
>                 {
>                         trace("cleanUp")
>                         removeEventListener(Event.ENTER_FRAME, _onEnterFrame);
>                         for each (var materialData:MaterialData in 
> _loader.materialLibrary)
> {
>                                 if (materialData.materialType == 
> "textureMaterial")
>                                 {
>                                         (materialData.material as 
> BitmapMaterial).bitmap.dispose()
>                                 }
>                                 materialData.material = null
>                         }
>                         _loader.geometry = null
>                         _view.scene.removeChild(_loader);
>                         _loader = null
>                         _clickFlag = false
>                 }
>                 private function setUp():void
>                 {
>
>                         trace("setUp")
>                         _loader = new LoaderCube();
>                         _view.scene.addChild(_loader);
>                         _loader.addEventListener(Loader3DEvent.LOAD_SUCCESS,
> _onLoaderSuccess)
>                         _loader.loadGeometry("assets/room/room_d.3ds", _md2);
>                         _clickFlag = true
>                 }
>                 private function _onLoaderSuccess(e:Loader3DEvent):void
>                 {
>                         trace("_onLoaderSuccess")
>                         
> _loader.removeEventListener(Loader3DEvent.LOAD_SUCCESS,
> _onLoaderSuccess)
>                         addEventListener(Event.ENTER_FRAME, _onEnterFrame);
>                 }
>
>                 private function _onEnterFrame(e:Event):void
>                 {
>                         _view.render();
>                 }
>         }
>
> }
>
> There seems to be alot of people having the same sort of problem...
>
> I've spent 3 days on this already and I can't really afford to spend
> any more trying to figure out where I am going wrong, as I pretty sure
> it's a leak in Away3D.
>
>  Do you think if I made my Away3D section an external SWF it would
> solve the memory leak?
>
> On Jun 7, 4:26 pm, colouredfunk <[email protected]> wrote:
>
> > hey, still getting the same problem... I'm only creating view/scene/
> > camera once. clearing all objects that I create, remove listeners...
> > but thememorykeeps on going up.... like you said  Number3D is the
> > main suspect as it is taking up most of thememoryas it never getting
> > any smaller!!
>
> > This must amemoryleakin Away3D no?
>
> > On Jun 7, 1:16 pm, Jensa <[email protected]> wrote:
>
> > > Yeah. Just keep an instance of the View (or engine if you will)
> > > somewhere in your app and add it to stage when you need it. Not sure
> > > of your app setup, but maybe reference it using a Singleton/Static
> > > class var so it's easy to instantiate and push to stage from anywhere?
>
> > > As your file showed, there is most probably somememoryleakin the
> > > view but it shouldn't be a problem if you do it like this. I didn't
> > > check it fully, but it looked like the objects declared on stage were
> > > not properly unreferenced as it was Number3D, Vertices, UV and other
> > > basic classes that kept increasing in instance count in the profiler.
> > > I'll see if I can look closer at it.
>
> > > J
>
> > > On Jun 7, 1:30 pm, colouredfunk <[email protected]> wrote:
>
> > > > Hi thanks so much into looking into my problem.
>
> > > > The reason why I had the view and scene created each time is because
> > > > on the website I am creating it's a mixture of 3D and normal 2D
> > > > sections... so on the other sections other than the Away3D I want to
> > > > destroy everything, to keep everything nice and clean..
>
> > > > So are you saying I can't properly ever kill an Away3D section?
>
> > > > If so, I guess there are two options; make the Away3D section an
> > > > external SWF... or to leave the core engine in the background and not
> > > > reinstantiate it each time the section loads...
>
> > > > On Jun 7, 9:38 am, Jensa <[email protected]> wrote:
>
> > > > > @colouredfunk You did not write what version of Away3D (Full/Lite, F9/
> > > > > F10) you were using, but based on your code I guessed it was the Flash
> > > > > 9 branch.
>
> > > > > I've had a look at your file using the Flash Builder profiler and I
> > > > > get the same results but this is not amemoryleakin Away3D. Your
> > > > > main problem here is that you add and remove the view all the time.
> > > > > You should not need to do this ever. One view should be enough for any
> > > > > object as you can change what scene it is rendering.
>
> > > > > In the example below, I've changed your code so that the view is only
> > > > > created once and that on every second frame we make 500 planes and
> > > > > render them so we see some faster results. On the next frame we remove
> > > > > them.
>
> > > > > Pay close attention to your profiler as you run this code. Initially,
> > > > > a lot of objects will accumulate and it will look like there is a
> > > > >memoryleak. However - after creating some ten thousand planes, the
> > > > >memoryusage flattens out. It's only at this point that the Garbage
> > > > > Collection kicks in.
>
> > > > > J
>
> > > > > CODE:
>
> > > > > package
> > > > > {
> > > > >         import away3d.containers.View3D;
> > > > >         import away3d.materials.WireColorMaterial;
> > > > >         import away3d.primitives.Plane;
>
> > > > >         import flash.display.Sprite;
> > > > >         import flash.events.Event;
> > > > >         import flash.events.MouseEvent;
>
> > > > >         [SWF(backgroundColor="#000000", width="800", height="600")]
> > > > >         public class Leak3 extends Sprite
> > > > >         {
> > > > >                 private var _view:View3D;
> > > > >                 private var _clickFlag:Boolean = false
> > > > >                 private var numPlanesPerFrame:Number = 500;
> > > > >                 private var planeArray:Array;
>
> > > > >                 public function Leak3()
> > > > >                 {
> > > > >                         planeArray = new Array();
> > > > >                         _view = new View3D();
> > > > >                         addChild(_view);
> > > > >                         _view.x = 400;
> > > > >                         _view.y = 300;
> > > > >                         
> > > > > this.stage.addEventListener(Event.ENTER_FRAME, _onMouseClick);
> > > > >                 }
> > > > >                 private function _onMouseClick(e:Event):void
> > > > >                 {
> > > > >                         if (_clickFlag) {
> > > > >                                 cleanUp();
> > > > >                         } else {
> > > > >                                 setUp();
> > > > >                                 _onEnterFrame(e);
> > > > >                         }
> > > > >                 }
> > > > >                 private function cleanUp():void
> > > > >                 {
> > > > >                         var plane:Plane;
> > > > >                         while(planeArray.length > 0){
> > > > >                                 plane = planeArray.pop() as Plane;
> > > > >                                 _view.scene.removeChild(plane);
> > > > >                         }
> > > > >                         _clickFlag      = false;
>
> > > > >                 }
> > > > >                 private function setUp():void
> > > > >                 {
> > > > >                         var i:int; var plane:Plane;
> > > > >                         for(i = 0; i<numPlanesPerFrame;i++){
> > > > >                                 _clickFlag = true;
> > > > >                                 plane = new Plane();
> > > > >                                 plane.width = 80;
> > > > >                                 plane.height = 60;
> > > > >                                 plane.x = 800*Math.random()-400;
> > > > >                                 plane.y = 600*Math.random()-300;
> > > > >                                 plane.bothsides = true;
> > > > >                                 plane.material = new 
> > > > > WireColorMaterial();
> > > > >                                 _view.scene.addChild(plane);
> > > > >                                 planeArray.push( plane );
> > > > >                         }
> > > > >                 }
> > > > >                 private function _onEnterFrame(e:Event):void
> > > > >                 {
> > > > >                         _view.render();
> > > > >                 }
> > > > >         }
>
> ...
>
> read more »

Reply via email to