Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > chabapok

Оценить эту запись

Сегодня я свалил флеш плеер...

Запись от chabapok размещена 25.06.2010 в 01:26

При помощи AS3 можно свалить флешплеер. Фаерфокс вылетает полностью, и дебаг флеш плеер, и обычный. Я даже обновился до 10.1 ветки - все падает. Проекторы тоже вылетают.

Падает не стабильно, иногда работает иногда нет.

В моей флешке используется движок away3dlite, 3-д тела скомпилены в отдельные swf при помощи hxswfml. В каждой такой swf лежит два класса - bytearray унаследованный от 3ds тела, и jpg с текстурой.

собственно, типичный загружаемый объект компилится командой "hxswfml xml2swf raptor.xml raptor.swf" и выглядит так

Код AS1/AS2:
<?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 - тоже не помогло.

Код AS3:
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 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Цитата:
при этом функция addEventListener не перегружена.
Нету в ас3 перегрузки, нету )
Старый 25.06.2010 20:54 chabapok вне форума
chabapok
override public function addEventListener(блаблабла) <- вот это перегрузка
Старый 25.06.2010 22:46 dimarik вне форума
dimarik
 
Аватар для dimarik
Перегрузка - вплоть до полного изменения сигнатуры. Здесь лучше сказать "переопределённый".

Я тоже валю флеш-плеер с двух строчек. Наповал )
Обновил(-а) dimarik 25.06.2010 в 22:48
Старый 26.06.2010 00:38 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Хм, а как Вы перегрузите метод с одной и той же сигнатурой? Компилятор не будет знать, какой метод вызвать. Может, конечно, вызывать метод что определен позднее (в том же классе, конечно) - но он как минимум должен выдать предупреждение, что уже не айс.

Поэтому переопределение.
Старый 26.06.2010 03:21 dimarik вне форума
dimarik
 
Аватар для dimarik
Тигра, у тебя тоже монолог пошел? )
 
Последние записи от chabapok

 


Часовой пояс GMT +4, время: 19:26.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.