Сегодня я свалил флеш плеер...
Запись от chabapok размещена 25.06.2010 в 01:26
При помощи AS3 можно свалить флешплеер. Фаерфокс вылетает полностью, и дебаг флеш плеер, и обычный. Я даже обновился до 10.1 ветки - все падает. Проекторы тоже вылетают.
Падает не стабильно, иногда работает иногда нет.
В моей флешке используется движок away3dlite, 3-д тела скомпилены в отдельные swf при помощи hxswfml. В каждой такой swf лежит два класса - bytearray унаследованный от 3ds тела, и jpg с текстурой.
собственно, типичный загружаемый объект компилится командой "hxswfml xml2swf raptor.xml raptor.swf" и выглядит так
<?xml version="1.0" ?> <swf> <Header width="500" height="500" fps="30" version="10" compressed="true" frameCount="1" /> <FileAttributes /> <SetBackgroundColor/> <DefineBitsJPEG id="1" file="raptor.jpg" /> <SymbolClass id="1" class="ObjMaterial" base="flash.display.Bitmap" /> <DefineBinaryData id="2" file="raptor.3ds" /> <SymbolClass id="2" class="Obj" base="flash.utils.ByteArray" /> <ShowFrame/> </swf>
падение возникает через какое-то время после попытки убрать со сцены 1 предмет и добавить на сцену другой.
было подозрение что обращения к stage из away3dlite к бобру не приведут. Я пробежался по либе с движком и везде поубирал эти обращения, чтобы stage вообще не использовался. Не помогло.
однажды я даже вычислил что валит его. Его валила вот такая строчка
objForRot.addEventListener(MouseEvent3D.MOUSE_DOWN, onMouseDown1);
при этом функция addEventListener не перегружена.
но валила не сама строчка, а ее наличие. То есть трэйсы дальше по ходу выполнялись вплоть до конца функции-обработчика события Event.COMPLETE. После перегрузки компа это место перестало быть проблемным. Даже подозрение на комп было, но сам комп, вроде, стабильно работает. Глюков у него не замечалось ранее.
Такое впечатление, что глюк возникает при объемном выделении или очистке памяти. Иногда.
Решил проблему так - при необходимости сменить объект, делаю removeChild вообще базовому спрайту, создаю его по новой, снова инициализация 3д движка, и гружу объект в "чистый" движок. Не оптимально, но вроде стабильней %)
Ниже приведу фрагменты кода, которые иногда валят браузер. Собственно, код кривоват, поскольку делался методом последовательных приближений туториала по движку.
То есть если делать load(адрес другого файла), то иногда имеем глюки, а если пересоздать весь класс в котором этот код, а только потом сделать load, то вроде не падает.
Еще пробовал дождаться события UNLOAD, а только потом грузить - не помогло, и пробовал для каждой загрузки создавать свой объект Loader - тоже не помогло.
function ViewPanel() { //конструктор super(); init(); } public function init() { initEngine(); initListeners(); } public function load(link) { removeEventListener(Event.ENTER_FRAME, onEnterFrame); if (objForRot !=null){ scene.removeChild(objForRot); objForRot.removeEventListener(MouseEvent3D.MOUSE_DOWN, onMouseDown1); camera.hover(); view.render(); } objForRot = null; try { modelLoader.close(); }catch (err) { } try { modelLoader.unloadAndStop(true); }catch(err){} modelLoader = new Loader(); modelLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete); modelLoader.load(new URLRequest(link)); } private function onLoaderComplete(ev=1) { modelLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onLoaderComplete); ObjMat = modelLoader.contentLoaderInfo.applicationDomain.getDefinition("ObjMaterial") as Class; Obj = modelLoader.contentLoaderInfo.applicationDomain.getDefinition("Obj") as Class; initObjects(); addEventListener(Event.ENTER_FRAME, onEnterFrame); objForRot.addEventListener(MouseEvent3D.MOUSE_DOWN, onMouseDown1); } private function initEngine():void{ scene = new Scene3D(); camera = new HoverCamera3D(); camera.panAngle = 0; camera.tiltAngle = 0; camera.minTiltAngle = 0; camera.maxTiltAngle = 360; camera.yfactor =1; camera.distance = 200; camera.hover(true); view = new View3D(scene, camera, new BasicRenderer()); addChildAt(view,0); //stage.quality = StageQuality.LOW; //addChild(new Stats); } private function initObjects():void{ max3ds = new Max3DS(); max3ds.scaling = 100; max3ds.centerMeshes = true; max3ds.material = Cast.material(ObjMat); var obj:ByteArray = new Obj(); var loader:Loader3D = new Loader3D(); loader.addEventListener(Loader3DEvent.LOAD_SUCCESS, function(ev) { loader.removeEventListener(Loader3DEvent.LOAD_SUCCESS, arguments.callee); var model = loader.handle as ObjectContainer3D; model.rotationX = -90; } ); //loader.loadGeometry("Pistol.3ds", max3ds); loader.loadTextures(obj, max3ds); trace("loadTextures ok"); objForRot = loader.handle; scene.addChild(objForRot); trace("add child ok"); } private function initListeners():void{ addEventListener(Event.ENTER_FRAME, onEnterFrame); //scene.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown1); MainClass.instance.addEventListener(MouseEvent.MOUSE_UP, onMouseUp1); //stage.addEventListener(Event.RESIZE, onResize); onResize(); } private function onEnterFrame(event:Event):void { if (objForRot == null) return; if (move){ objForRot.rotationX = -0.8*(MainClass.instance.mouseY - lastMouseY)+lastRx; objForRot.rotationY = -0.8 * (MainClass.instance.mouseX - lastMouseX) + lastRy; } else{ if (permitRotate){ objForRot.rotationX += 0.8; objForRot.rotationY += 1.5; objForRot.rotationZ += 0.1; } } camera.hover(); view.render(); }
Всего комментариев 6
Комментарии
25.06.2010 16:24 | |
Цитата:
Сегодня я свалил флеш плеер...
|
25.06.2010 19:12 | |
Цитата:
при этом функция addEventListener не перегружена.
|
25.06.2010 20:54 | |
override public function addEventListener(блаблабла) <- вот это перегрузка
|
25.06.2010 22:46 | |
Перегрузка - вплоть до полного изменения сигнатуры. Здесь лучше сказать "переопределённый".
Я тоже валю флеш-плеер с двух строчек. Наповал ) |
|
Обновил(-а) dimarik 25.06.2010 в 22:48
|
26.06.2010 03:21 | |
Тигра, у тебя тоже монолог пошел? )
|
Последние записи от chabapok
- Сегодня я свалил флеш плеер... (25.06.2010)