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 ยป
