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 <explomas...@gmail.com> 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 <macro.mar...@gmail.com> 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 <fabric...@gmail.com> 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 = 0;i < iteration; ++i) {
>> >                                 cubeclone = cube.clone() as Mesh;
>> >                                 cubeclone.x = offset + (i*increase);
>> >                                 cubeclone.y = i*50;
>> >                                 meshes.push(cubeclone);
>> >                         }
>> >
>> _view.scene.addChild(merge.applyToMeshes(receiver, meshes));
>> >                         cube = null;
>> >                 }
>> >
>> > I'll add soon these in the examples section.
>> >
>> > cheers,
>> > Fabrice
>>
>
>
>
> --
> Michael Ivanov ,Programmer
> Neurotech Solutions Ltd.
> Flex|Air |3D|Unity|
> www.neurotechresearch.com
> http://blog.alladvanced.net
> Tel:054-4962254
> mich...@neurotech.co.il
> t...@neurotech.co.il
>
>

Reply via email to