Hello, developers! I have a problem with a performance of own scene. I try to build about 10 000 objects on scene with away3d. Now i have over 30 000 polygons, a visible at once is about 500-2000. It required ~230 mb of RAM (Internet Explorer, AwayStats shows ~160 mb) and have 5-10 fps while camera is moving. It's to much RAM is using and to low fps rate to me. I would be pleased for help in optimization of my engine and for some advices about optimization tricks. As well I would be pleased for pointing out my mistakes.
There are some screens: http://imageshost.ru/photo/74374/id21221.html http://imageshost.ru/photo/80867/id21220.html I'm using Rectangle Clipping, obectCulling = true, Renderer = BASIC. Material is ShadingColorMAterial with one light source. I think about using LODObject, but it probably will be used more RAM or not? To limit the range of visibility i'm using following event code (on move): public function onMove(e:KSEvents):void { for each (var Obj3D:Object3D in baseAway.view.scene.children) { if (baseCamera.position.distance(Obj3D.position)>DistanceOfView) { Obj3D.visible = false; } else { Obj3D.visible = true; } } } Creating view code: <?xml version="1.0" encoding="utf-8"?> <mx:UIComponent xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%"> <mx:Script> <![CDATA[ import away3d.containers.Scene3D; import away3d.containers.View3D; import away3d.core.clip.FrustumClipping; import away3d.core.clip.RectangleClipping; import away3d.core.render.*; public var view:View3D; public var scene:Scene3D; override protected function createChildren():void { super.createChildren(); scene = new Scene3D(); view = new View3D(); view.scene = scene; view.renderer = Renderer.BASIC; addChild(view); view.addEventListener(Event.ADDED_TO_STAGE, update); // Make sure the first frame is rendered } override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void { super.updateDisplayList(unscaledWidth, unscaledHeight); update(); } private function update(e:* = null):void { if(view.stage){ view.x = unscaledWidth/2; view.y = unscaledHeight/2; view.clipping = new RectangleClipping({minX:-unscaledWidth/ 2,minY:-unscaledHeight/2,maxX:unscaledWidth/2,maxY:unscaledHeight/2}); view.clipping.objectCulling = true; view.render(); } } ]]> </mx:Script> </mx:UIComponent> Some code of class my object's class: public class Tube extends KSMesh { ... Building faces: for (var i:int = 0; i< (VertexArray[j] as Vector.<Vertex>).length-1; i++) { // first triangle of quad var FirstFace:Face = new Face(); FirstFace.v0 = (VertexArray[j] as Vector.<Vertex>)[i]; FirstFace.v1 = (VertexArray[j] as Vector.<Vertex>)[i+1]; FirstFace.v2 = (VertexArray[j+1] as Vector.<Vertex>)[i]; this.addFace(FirstFace); FirstFace = null; // second triangle of quad var SecondFace:Face = new Face(); SecondFace.v0 = (VertexArray[j] as Vector.<Vertex>)[i+1]; SecondFace.v1 = (VertexArray[j+1] as Vector.<Vertex>)[i+1]; SecondFace.v2 = (VertexArray[j+1] as Vector.<Vertex>)[i]; this.addFace(SecondFace); SecondFace = null; } ... constructor public function Tube(Points:Vector.<Number3D>, Radius:Number, PipeKey:Number) { super(null); this.diameter = Radius*2; this.ObjKey = PipeKey; var ComplexPoints:Array = new Array; var TwoDots:Array = new Array(); for (var i:int = 0; i<Points.length-1; i++) { // TwoDots = GetFanCoords(Points[i], Points[i+1], 4, Radius); ComplexPoints[ComplexPoints.length] = TwoDots[0]; ComplexPoints[ComplexPoints.length] = TwoDots[1]; } // BuildFaces(ComplexPoints); // this.centerPivot(); this.material = new ShadingColorMaterial(0x555555); this.invertFaces(); this.bothsides = true; // welding var weld:Weld = new Weld(false); weld.apply(this); // weld = null; TwoDots = null; ComplexPoints = null; } Tnx for help.
