Hey Choons, yeah, that's my backup plan if I can't get the Sprite3Ds
performing well. But it would be a shame to re-write the Sprite3D
functionality into a Mesh, since the Sprite3D's inheritance chain seems to
deliberately avoid extending from Mesh, probably for performance reasons:

Sprite3D [image: Inheritance]
Entity<http://away3d.com/livedocs/broomstick/Away3D/away3d/entities/Entity.html>
 [image: Inheritance]
ObjectContainer3D<http://away3d.com/livedocs/broomstick/Away3D/away3d/containers/ObjectContainer3D.html>
 [image: Inheritance]
Object3D<http://away3d.com/livedocs/broomstick/Away3D/away3d/core/base/Object3D.html>


On Tue, Jun 14, 2011 at 4:12 PM, Choons <[email protected]> wrote:

> could you use 1 segment planes and make them lookAt the camera? Then
> you could merge them and see if it performs better
>
> On Jun 14, 1:06 am, Jahiro Himalaya <[email protected]> wrote:
> > Hi Michael,
> >
> > The issue isn't with re-spawning/re-using. I just create a static set of
> > between 500 - 1000 Sprite3Ds and the FPS drops to nothing (even when
> > re-using the same Bitmap Material for all the Sprite3Ds).
> >
> > The demo above has 1000+ meshes using the Merge class, so I would think
> it
> > would be possible to also have a 1000+ Sprite3Ds, as there's less
> complexity
> > involved in a Sprite3D, compared to a Mesh, right?
> >
> > I imagine you might be doing something tricky with FLINT to achieve lots
> of
> > particle instances? I'm just adding my Sprite3Ds to an object container
> and
> > adding to the stage.
> >
> >
> >
> >
> >
> >
> >
> > On Tue, Jun 14, 2011 at 3:56 PM, Michael Iv <[email protected]>
> wrote:
> > > I  guess you are having those problems trying to spawn new sprite
> instances
> > > frequently ? Try reusing them
> >
> > > On Tue, Jun 14, 2011 at 7:33 AM, Jahiro <[email protected]>
> wrote:
> >
> > >> Hi Fabrice,
> >
> > >> I'd like use the Merge class on a group of Sprite3Ds, is that
> > >> possible? It looks like the Merge class only deals with Meshes, and
> > >> Sprite3D doesn't extend Mesh.
> >
> > >> I'm struggling with performance issues having lots of Sprite3Ds on the
> > >> stage at one time - would be great if I could fix it with the Merge
> > >> class.
> >
> > >> Any ideas?
> >
> > >> Thanks
> >
> > >> On May 27, 12:25 am, Fabrice3D <[email protected]> wrote:
> > >> > Hi all,
> > >> > Merge class is updated (in Git repo)
> > >> > various issues were fixed and lots of enhancement/rewriting was
> done.
> >
> > >> > in big lines what is now different with previous version:
> >
> > >> > 1:
> > >> > constructor has changed, the first param "objectspace" is now the
> third
> > >> param.
> > >> > simply because in 99% of cases, you do not need object space
> >
> > >> > so where you did say, new Merge(false, true, true); , you can update
> > >> your code by just getting rid of first param as its by default false
> > >> > becomes --> new Merge(true, true);
> >
> > >> > 2:
> > >> > Added new method, as I've seen already several cases where you were
> > >> merging during a loop.
> > >> > public function applyToMeshes(receiver:Mesh,
> meshes:Vector.<Mesh>):Mesh
> > >> > (see first snippet example)
> >
> > >> > 3:
> > >> > it takes now in account, scale, and rotations of the to be merged
> items,
> > >> but also respects reciever rotations and scale.
> > >> > It is faster and uses less resource than previous version
> > >> > It supports now also cloned meshes inputs and even empty mesh (new
> > >> Mesh()) as receiver
> >
> > >> > merging multiple meshes
> > >> > if you merge for instance from a loaded model or if you loop to
> generate
> > >> a merged mesh
> > >> > do not use "apply", instead, use "applyToMeshes" or
> "applyToContainer"
> > >> > apply would work but would ask way more processing time.
> >
> > >> > A few examples with few variations in use. Covering probably most of
> > >> your possible cases.
> >
> > >> > merge.applyToMeshes
> > >> >                 private function mergeUsingVectors() : void
> > >> >                 {
> > >> >                         var iteration : uint = 20;
> > >> >                         var increase : Number = 200;
> > >> >                         var offset:Number = -((increase *iteration)
> > >> *.5);
> >
> > >> >                         var merge:Merge = new Merge(false, false);
> >
> > >> >                         var bmd:BitmapData = new
> > >> BitmapData(64,64,false,0xFF00FF);
> > >> >                         var mat:BitmapMaterial = new
> > >> BitmapMaterial(bmd,true,false,true);
> > >> >                         mat.lights = [_light1, _light2];
> >
> > >> >                         var sphere : Sphere;
> > >> >                         var sphereReceiver : Sphere;
> >
> > >> >                         var meshes:Vector.<Mesh> = new
> Vector.<Mesh>();
> > >> >                         var i:uint;
> > >> >                         var scaleIncrease:Number = .1;
> > >> >                         var nscale:Number = 0.2;
> > >> >                         for (i = 0;i < iteration; ++i) {
> > >> >                                 sphere = new Sphere(mat, 100*nscale,
> 6,
> > >> 6);
> > >> >                                 sphere.x = offset + (i*increase);
> > >> >                                 sphere.y = Math.sin(sphere.x)*100;
> > >> >                                 meshes.push(Mesh(sphere));
> >
> > >> >                                 nscale+=scaleIncrease;
> > >> >                         }
> >
> > >> _view.scene.addChild(merge.applyToMeshes(Mesh(meshes.shift()),
> meshes));
> > >> >                 }
> >
> > >> > merge.applyToContainer
> > >> > in this case we loop, but this could be your loaded model (make sure
> if
> > >> your model have more material to set keepMaterial to true)
> >
> > >> >                 private function mergeWithContainer() : void
> > >> >                 {
> > >> >                         var _rows : Number = 8;
> > >> >                         var _space : Number = 250;
> > >> >                         var _radius : Number = 200;
> >
> > >> >                         var merge:Merge = new Merge(false,true);
> >
> > >> >                         var sphere : Sphere;
> > >> >                         var container:ObjectContainer3D = new
> > >> ObjectContainer3D();
> >
> > >> >                         var z:uint;
> > >> >                         var y:uint;
> > >> >                         var x:uint;
> > >> >             for (z = 0;z < _rows; ++z) {
> > >> >                 for (y= 0;y < _rows;++y) {
> > >> >                     for (x = 0;x < _rows;++x) {
> > >> >                                                 sphere = new
> > >> Sphere(null, _radius, 6, 6, true );
> > >> >                                                 sphere.x =
> > >> -(_rows*(_radius+_space)*0.5) + x * _radius * 2 + (x*_space);
> > >> >                                                 sphere.y =
> > >> -(_rows*(_radius+_space)*0.5) + y * _radius * 2 + (y*_space);
> > >> >                                                 sphere.z =
> > >> -(_rows*(_radius+_space)*0.5) + z * _radius * 2 + (z*_space);
> >
> > >> container.addChild(sphere);
> > >> >                     }
> > >> >                 }
> > >> >             }
> >
> > >> >                         var mergedMesh:Mesh =
> > >> merge.applyToContainer(container, "myMergedMesh");
> >
> > >> >                         var bmd:BitmapData = new
> > >> BitmapData(64,64,false,0xFF00FF);
> > >> >                         var mat:BitmapMaterial = new
> > >> BitmapMaterial(bmd,true,false,true);
> > >> >                         mat.lights = [_light1, _light2];
> >
> > >> >                         mergedMesh.material = mat;
> > >> >                         _view.scene.addChild(mergedMesh);
> > >> >                 }
> >
> > >> > merge.apply
> > >> > in this case, notice that the scale and rotations of originals are
> > >> respected, if you compare with the green non merged cubes placed right
> > >> above.
> >
> > >> >                 private function singleMerge() : void
> > >> >                 {
> > >> >                         //we want to keep the materials different
> and
> > >> clear the source
> > >> >                         var merge:Merge = new Merge(true, true);
> >
> > >> >                         var matcube:BitmapMaterial = new
> > >> BitmapMaterial(new BitmapData(256,256, false, 0xFF0000));
> > >> >                         var matcube1:BitmapMaterial = new
> > >> BitmapMaterial(new BitmapData(256,256, false, 0x0000FF));
> > >> >                         matcube.lights = [_light1, _light2];
> > >> >                         matcube1.lights = [_light1, _light2];
> >
> > >> >                         var cube1:Cube = new Cube(matcube, 800, 400,
> > >> 100);
> > >> >                         var cube2:Cube = new Cube(matcube1, 800,
> 400,
> > >> 100);
> >
> > >> >                         cube1.x = 600;
> > >> >                         cube2.x = -600;
> > >> >                         cube1.z = cube2.z = 0;
> > >> >                         cube1.y = cube2.y = 0;
> >
> > >> >                         //here an example where the reciever as
> scale
> > >> and rotations
> > >> >                         cube1.rotationY = -45;
> > >> >                         cube2.rotationY = 45;
> >
> > >> >                         cube1.scaleY = 2;
> > >> >                         cube2.scaleY = 2;
> >
> > >> >                         merge.apply(cube1, cube2);
> > >> >                         _view.scene.addChild(cube1);
> >
> > >> >                         // the same settings but higher on y not
> merge
> > >> to check results, shown here in green
> > >> >                         var matcube2:BitmapMaterial = new
> > >> BitmapMaterial(new BitmapData(256,256, false, 0x00FF00));
> > >> >                         matcube2.lights = [_light1, _light2];
> > >> >                         var cube3:Cube = new Cube(matcube2, 800,
> 400,
> > >> 100);
> > >> >                         var cube4:Cube = new Cube(matcube2, 800,
> 400,
> > >> 100);
> >
> > >> >                         cube3.x = 600;
> > >> >                         cube4.x = -600;
> > >> >                         cube3.z = cube4.z = 0;
> > >> >                         cube3.y = cube4.y = 800;
> >
> > >> >                         cube3.rotationY = -45;
> > >> >                         cube4.rotationY = 45;
> >
> > >> >                         cube3.scaleY = 2;
> > >> >                         cube4.scaleY = 2;
> >
> > >> >                         _view.scene.addChild(cube3);
> > >> >                         _view.scene.addChild(cube4);
> >
> > >> >                 }
> >
> > >> > example of empty reciever and the use of clones
> > >> >                 private function mergeWithClones() : void
> > >> >                 {
> > >> >                         var merge:Merge = new Merge(true, true);
> >
> > >> >                         var matcube:BitmapMaterial = new
> > >> BitmapMaterial(new BitmapData(256,256, false, 0xFF0000));
> > >> >                         matcube.lights = [_light1, _light2];
> >
> > >> >                         var cube:Cube = new Cube(matcube, 800, 400,
> > >> 100);
> > >> >                         var meshes:Vector.<Mesh> = new
> Vector.<Mesh>();
> >
> > >> >                         //empty mesh reciever
> > >> >                         var receiver:Mesh = new Mesh();
> > >> >                         var cubeclone:Mesh;
> >
> > >> >                         var i:uint;
> > >> >                         var iteration : uint = 20;
> > >> >                         var increase : Number = 200;
> > >> >                         var offset:Number = -((increase *iteration)
> > >> *.5);
> >
> > >> >                         for (i
> >
> > ...
> >
> > read more ยป

Reply via email to