« Return to Thread: Object deletion and Memory Issue

Re: Object deletion and Memory Issue

by kay w. :: Rate this Message:

Reply to Author | View in Thread

now it works with bitmapfilemateials too.

i modified the bitmapfilematerial class. the destroy function detach now the file url from _loaderUrls dictionary, _subscribedMaterials object and _loadedBitmaps object.

---

override protected function destroy():void
{
        super.destroy();
                       
        bitmap.dispose();
                       
        // kill original url in dictionary
        delete _loaderUrls[url];
                       
        // unsubscribe material
        _subscribedMaterials[ url ] = null;
                       
        // kill from loaded bitmap library
        _loadedBitmaps[ url ] = null;

}

---


hth
kay




kay w. wrote:
hey seb,

thanks for your quick response.

i looked for dictionary in MaterialManager and MaterialObject3D and finally i added a new function in MaterialObject3D:

public function dispose( do3d:DisplayObject3D ):void{
           
            //unregister do3d from objects dictionary
            unregisterObject( do3d );
           
            //unregister from materialmanager
            destroy();
           
            //reset some attributes
            //maybe not necessary
            renderLayer = null;
            interactive = false;
}



i have build a little test.

if you click on the first button ten spheres with listeners will create and store in an array.
-----------------------
private function removeCreateClick(event : MouseEvent) : void {          
           //array not empty, clear it
           clickRemove();          
           //create spheres
            for( var i : int = 0; i < 10; i ++){          
                var mat : ColorMaterial = new ColorMaterial( 0xff0000, .3 );
                mat.interactive = true;              
                mat.addEventListener( MouseEvent.CLICK, mousehandleClick );
                mat.addEventListener( MouseEvent.MOUSE_OUT, mousehandleOut);
                mat.addEventListener( MouseEvent.MOUSE_OVER, mousehandleOver );              
                var obj : Sphere = new Sphere( mat, 100, 16, 12 );              
                obj.x = RandomNumber.generate(-1000, 1000);
                obj.y = RandomNumber.generate(-1000, 1000);
                obj.z = RandomNumber.generate(-1000, 1000);              
                obj.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, handleClick );
                obj.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, handleOut);
                obj.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, handleOver );              
                objectWrapper.addChild(obj);
                aObjects.push(obj);
            }
 }
-----------------------

if the array not empty, the exist objects will delete befor:
----------------------
private function clickRemove( event : MouseEvent = null ) : void {          
            for( var j : int = 0; j < aObjects.length; j++){              
                objectWrapper.removeChild( aObjects[j] as Sphere );              
                ( aObjects[j] as Sphere ).removeEventListener(InteractiveScene3DEvent.OBJECT_CLICK, handleClick );
                ( aObjects[j] as Sphere ).removeEventListener(InteractiveScene3DEvent.OBJECT_OUT, handleOut);
                ( aObjects[j] as Sphere ).removeEventListener(InteractiveScene3DEvent.OBJECT_OVER, handleOver );
                ( aObjects[j] as Sphere ).material.removeEventListener( MouseEvent.CLICK, mousehandleClick );
                ( aObjects[j] as Sphere ).material.removeEventListener( MouseEvent.MOUSE_OUT, mousehandleOut);
                ( aObjects[j] as Sphere ).material.removeEventListener( MouseEvent.MOUSE_OVER, mousehandleOver );    

           // this is my magical line ;)
                ( ( aObjects[j] as Sphere ).material as MaterialObject3D ).dispose( aObjects[j] as DisplayObject3D );


                aObjects[j] = null;              
            }
            aObjects = new Array();          
        }
---------------------


before: http://beta.mit.de/kwiegand/performancetest/memtest_Bad.html

after: http://beta.mit.de/kwiegand/performancetest/memtest_allGood.html

it seems working good.


BUT.... ONE PROBLEM :(

with bitmapassetmaterial und bitmapmaterial i have some issue.
first dispose is ok, but the second use of the matial doesn't work. i get this error:

ArgumentError: Error #2015: Ungültiges BitmapData.
    at flash.display::BitmapData/get width()
    at org.papervision3d.materials::BitmapMaterial/transformUV()
    at org.papervision3d.materials::BitmapMaterial/drawTriangle()
    at org.papervision3d.core.render.command::RenderTriangle/render()
    at org.papervision3d.render::BasicRenderEngine/org.papervision3d.render:BasicRenderEngine::doRender()
    at org.papervision3d.render::BasicRenderEngine/renderScene()
    at MemoryTest/renderLoop()


any idea?




regards

kay

 « Return to Thread: Object deletion and Memory Issue