使用 Away3D4
若是使用不斷產生物件並移除掉的方式時
移除並不會清除記憶體;會一直堆疊上去
到一定程度的時候會出現 Error #3691
Main Thread (Suspended: Error: Error #3691: 超過此資源類型的資源限制。)
flash.display3D::Context3D/createVertexBuffer [no source]
away3d.core.base::SubGeometry/getVertexBuffer
away3d.core.base::SubMesh/getVertexBuffer
away3d.materials.passes::MaterialPassBase/render
away3d.materials.passes::DefaultScreenPass/render
away3d.materials::MaterialBase/renderPass
away3d.core.render::DefaultRenderer/drawRenderables
away3d.core.render::DefaultRenderer/draw
away3d.core.render::RendererBase/executeRender
away3d.core.render::RendererBase/render
away3d.containers::View3D/render
TestCreateObject/renderHandler
以這個
範例 測試RAM 大約跑到 22X 左右就掛了
有的程式碼環境比較複雜一點約 6X 就會掛了
程式碼
package
{
import away3d.cameras.Camera3D;
import away3d.containers.Scene3D;
import away3d.containers.View3D;
import away3d.controllers.HoverController;
import away3d.debug.AwayStats;
import away3d.debug.Trident;
import away3d.materials.ColorMaterial;
import away3d.primitives.Sphere;
import com.bit101.components.CheckBox;
import com.darcey.ui.SliderList;
import com.greensock.TweenLite;
import com.greensock.easing.Bounce;
import flash.display.*;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.utils.Timer;
[SWF(backgroundColor="#ffffff", frameRate="60", quality="LOW", width="800", height="600")]
public class TestCreateObject extends Sprite
{
// Away3D4 Vars
private var scene:Scene3D;
private var camera:Camera3D;
private var view:View3D;
private var cameraController:HoverController;
// Away3D4 Camera handling variables (Hover Camera)
private var move:Boolean = false;
private var lastPanAngle:Number;
private var lastTiltAngle:Number;
private var lastMouseX:Number;
private var lastMouseY:Number;
// Away3D Helpers
private var stats:AwayStats;
private var trident:Trident;
// Away3D Config
private var cameraViewDistance:Number = 100000;
private var antiAlias:Number = 2;
private var primitiveMaterial:ColorMaterial;
public function TestCreateObject()
{
this.addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler, false, 0, true);
}
private function addedToStageHandler(e:Event):void
{
this.removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
// Setup the stage
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
// Init
init();
}
private var timer:Timer
private function init():void
{
timer = new Timer(50)
timer.addEventListener(TimerEvent.TIMER, createPrimitivesAndModels);
setupAway3D4();
setupMaterials()
setupUI()
setupEventListeners();
// Attach Debug Box at the top of the display list
}
private function setupMaterials():void
{
primitiveMaterial = new ColorMaterial(Math.random() * 0xFFFFFF);
}
private function createPrimitivesAndModels(event:TimerEvent):void
{
var sphere:Sphere = new Sphere(primitiveMaterial,50+Math.random()*200,16,16);
sphere.x = -1500 + Math.random() * 3500;
sphere.z = -1500 + Math.random() * 3500;
scene.addChild(sphere);
TweenLite.from(sphere,2,{y:4000,ease:Bounce.easeOut,onComplete:onAnimComplete,onCompleteParams:[sphere]});
}
private function onAnimComplete(sphere:Sphere):void{
sphere.dispose(false)
scene.removeChild(sphere);
sphere = null
}
/*** Setup the Away3D 4 Engine */
private function setupAway3D4():void
{
// Setup scene
scene = new Scene3D();
// Setup camera
camera = new Camera3D();
camera.lens.far = cameraViewDistance;
// Setup view
view = new View3D();
view.scene = scene;
view.camera = camera;
view.antiAlias = antiAlias;
addChild(view);
cameraController = new HoverController(camera, null, 150, 10, 2000);
// Show Away3D stats
stats = new AwayStats(view,true);
stats.x = 5;
stats.y = 5;
this.addChild(stats);
// Show a Trident
trident = new Trident();
trident.scale(1);
scene.addChild(trident);
}
private function setupEventListeners():void
{
// Setup event listeners
stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
// Setup resize handler
stage.addEventListener(Event.RESIZE, resizeHandler);
resizeHandler(); // Good to run the resizeHandler to ensure everything is in its place
// Setup render enter frame event listener
stage.addEventListener(Event.ENTER_FRAME,renderHandler);
}
private function setupUI():void
{
var s:SliderList = new SliderList();
s.x = 10;
s.y = 90;
s.addSlider("Timer - delay",100,1,100,50,timer,"delay",false);
var _c:CheckBox = new CheckBox(s,0, 20, "autoCreate", changCheckBox);
this.addChild(s);
}
private function changCheckBox(evt:Event):void {
if (evt.currentTarget.selected) {
timer.start()
}else {
timer.stop()
}
}
private function renderHandler(e:Event):void
{
if (move) {
cameraController.panAngle = 0.3 * (stage.mouseX - lastMouseX) + lastPanAngle;
cameraController.tiltAngle = 0.3 * (stage.mouseY - lastMouseY) + lastTiltAngle;
}
view.render();
}
/*** Mouse down handler */
private function mouseDownHandler(e:MouseEvent):void
{
lastPanAngle = cameraController.panAngle;
lastTiltAngle = cameraController.tiltAngle;
lastMouseX = stage.mouseX;
lastMouseY = stage.mouseY;
move = true;
stage.addEventListener(Event.MOUSE_LEAVE, onStageMouseLeave);
}
/*** Mouse up handler */
private function mouseUpHandler(e:MouseEvent):void
{
move = false;
stage.removeEventListener(Event.MOUSE_LEAVE, onStageMouseLeave);
}
/*** Mouse stage leave handler */
private function onStageMouseLeave(e:Event):void
{
move = false;
stage.removeEventListener(Event.MOUSE_LEAVE, onStageMouseLeave);
}
/*** Resize handler */
private function resizeHandler(e:Event=null):void
{
view.width = stage.stageWidth;
view.height = stage.stageHeight;
}
}
}
由於多寫了一些控制項,真正在產生的程式碼只有五六行
測試環境
Flash Builder 4.5.1
Flex SDK 4.5.1
PlayerGlobal.swc PF 11
wmode= "Direct"
-swf-version=14
Flash Player 11.1 Plugin content debugger
Flash Player 11.1 Projector content debugger
若是有人有解決方式,煩請也跟我說