Hey,

It seems the actual geometry of the Plane is never disposed, which
prevents the buffers from being cleaned up. In any case, your current
approach will be sub-optimal. I would consider rewriting it to recycle
the Geometry object (in this case, do NOT dispose it), since it'll be
the same for every object. So in effect, create a Plane once
(statically, for example), have the particles simply extend Mesh
rather than Plane, and pass a reference to the geometry to the Mesh's
super constructor. Be sure to also recycle the material object if
possible. It will be faster and much more memory-friendly.
Further optimisations can be done by not creating and destroying
SmokeParticle objects, but reset "destroyed" ones as newly spawned
particles.

Hope that helps,
David

On Apr 11, 7:56 pm, Josh Beckwith <[email protected]> wrote:
> Game:http://positlabs.com/files/code/drive/
>
> I'm making a driving game of sorts. I made a dust effect that spawns a
> textured plane on enterframe 25% of the time. This plane grows for
> some time, and then it's removed from the scene.
>
> I made sure to limit the number of planes being displayed to 25.
>
> The game crashes after some time due to running out of resources for
> vertices or something like that. I don't think the planes are being
> disposed of properly.
>
> Here's the class:
>
> package {
>         import away3d.primitives.Plane;
>         import flash.events.TimerEvent;
>         import flash.geom.Vector3D;
>         import flash.utils.Timer;
>
>         public class SmokeParticle extends Plane {
>
>                 public static var globalCount : int;
>                 public static var collection : Vector.<SmokeParticle> = new
> Vector.<SmokeParticle>(26, false);
>
>                 private var fadetimer : Timer = new Timer(100);
>
>                 public function SmokeParticle(pos : Vector3D, rotY : Number) {
>                         super(Materials.SMOKE_MAT, 128, 128);
>
>                         if(globalCount > 25) {
>                                 destroy(collection[0]);
>                         }
>
>                         position = pos;
>                         rotationY = rotY + Math.random()*31 - 15;
>
>                         Drive.view.scene.addChild(this);
>                         collection.push(this);
>                         globalCount++;
>
>                         fadetimer.addEventListener(TimerEvent.TIMER, fade);
>                         fadetimer.start();
>
>                 }
>
>                 private function fade(e : TimerEvent) : void {
>                         scaleX += .3;
>                         scaleY += .3;
>
>                         if (fadetimer.currentCount == 15)destroy(this);
>                 }
>
>                 private function destroy(target : SmokeParticle) : void {
>                         if(target != null){
>                                 collection.shift();
>                                 target.dispose(false);
>                                 Drive.view.scene.removeChild(target);
>                                 
> target.fadetimer.removeEventListener(TimerEvent.TIMER, fade);
>                                 target.fadetimer.stop();
>                                 globalCount--;
>                         }
>                 }
>         }
>
> }
>
> And here's the error I get:
> Exception fault: Error: Error #3691: Resource limit for this resource
> type exceeded.
>         at flash.display3D::Context3D/createVertexBuffer()
>         at away3d.core.base::SubGeometry/getVertexNormalBuffer()[C:\Users
> \Beeker\workspace\Drive\src\away3d\core\base\SubGeometry.as:192]
>         at away3d.core.base::SubMesh/getVertexNormalBuffer()[C:\Users\Beeker
> \workspace\Drive\src\away3d\core\base\SubMesh.as:130]
>         at away3d.materials.passes::DefaultScreenPass/render()[C:\Users\Beeker
> \workspace\Drive\src\away3d\materials\passes\DefaultScreenPass.as:377]
>         at away3d.materials::MaterialBase/renderPass()[C:\Users\Beeker
> \workspace\Drive\src\away3d\materials\MaterialBase.as:308]
>         at away3d.core.render::DefaultRenderer/drawRenderables()[C:\Users
> \Beeker\workspace\Drive\src\away3d\core\render\DefaultRenderer.as:184]
>         at away3d.core.render::DefaultRenderer/draw()[C:\Users\Beeker
> \workspace\Drive\src\away3d\core\render\DefaultRenderer.as:109]
>         at away3d.core.render::RendererBase/executeRender()[C:\Users\Beeker
> \workspace\Drive\src\away3d\core\render\RendererBase.as:308]
>         at away3d.core.render::DefaultRenderer/executeRender()[C:\Users\Beeker
> \workspace\Drive\src\away3d\core\render\DefaultRenderer.as:88]
>         at away3d.core.render::RendererBase/render()[C:\Users\Beeker\workspace
> \Drive\src\away3d\core\render\RendererBase.as:289]
>         at away3d.core.render::DefaultRenderer/render()[C:\Users\Beeker
> \workspace\Drive\src\away3d\core\render\DefaultRenderer.as:79]
>         at away3d.containers::View3D/render()[C:\Users\Beeker\workspace\Drive
> \src\away3d\containers\View3D.as:254]
>         at Drive/onEnterFrame()[C:\Users\Beeker\workspace\Drive\src\Drive.as:
> 262]

Reply via email to