Показать сообщение отдельно
Старый 30.03.2006, 00:10
pkfun вне форума Посмотреть профиль Отправить личное сообщение для pkfun Посетить домашнюю страницу pkfun Найти все сообщения от pkfun
  № 1  
Ответить с цитированием
pkfun

Регистрация: Feb 2006
Сообщений: 580
По умолчанию Флэшка перестает тормозить при увеличении FPS. Почему?

Сделал небольшую флэшку. Из библиотеки атачится несколько мувиков. Каждый мувик атачится в определенный момент времени, начиная от начала фильма и сразу проигрывается. Каждый мувик, как проиграется, останавливается командой stop();. Анимация большинства мувиков несложная, без альф и т.д. Внутри мувиков статический текст, небольшого объема(надпись, одно два слова) с параметром "сглаживание для читабельности". Время от начала фильма измеряет getTimer() В качестве "цикла" выбрано событие onEnterFrame root-а.
Частота проигрывания задана 30 кадров в секунду.

Код:
var mainPlayTime:Number = null;
var pkFlagTextPk:Boolean = false;
var pkFlagLine1:Boolean = false;
var pkFlagLine2:Boolean = false;
var pkFlagButHistory:Boolean = false;
var pkFlagButLevels:Boolean = false;
var pkFlagButSecrets:Boolean = false;
var pkFlagButMonsterBook:Boolean = false;
var pkFlagButTaroCards:Boolean = false;
var pkFlagButBosses:Boolean = false;
var pkFlagButMultic:Boolean = false;
var pkFlagButFAQ:Boolean = false;
var pkFlagButTech:Boolean = false;
var pkFlagButInteresting:Boolean = false;
var pkFlagButCommunity:Boolean = false;
_root.onEnterFrame = function():Void  {
	mainPlayTime = getTimer();
	if (mainPlayTime>500 && pkFlagTextPk == false) {
		this.attachMovie("textPainkiller", "textPk", this.getNextHighestDepth());
		textPk._x = 7;
		textPk._y = 5;
		pkFlagTextPk = true;
	}
	if (mainPlayTime>1000 && pkFlagLine1 == false) {
		this.attachMovie("lineTextPk", "lineTextPk1", this.getNextHighestDepth());
		lineTextPk1._rotation = 90;
		lineTextPk1._yscale = 100;
		lineTextPk1._x = 200;
		lineTextPk1._y = 45;
		pkFlagLine1 = true;
	}
	if (mainPlayTime>1500 && pkFlagLine2 == false) {
		this.attachMovie("lineTextPk", "lineTextPk2", this.getNextHighestDepth());
		lineTextPk2._yscale = 120;
		lineTextPk2._rotation = -180;
		lineTextPk2._x = 7;
		lineTextPk2._y = 320;
		pkFlagLine2 = true;
	}
	if (mainPlayTime>2000 && pkFlagButHistory == false) {
		this.attachMovie("butHistory", "butHistory", this.getNextHighestDepth());
		butHistory._x = 20;
		butHistory._y = 50;
		pkFlagButHistory = true;
	}
	if (mainPlayTime>2300 && pkFlagButLevels == false) {
		this.attachMovie("butLevels", "butLevels", this.getNextHighestDepth());
		butLevels._x = 20;
		butLevels._y = 75;
		pkFlagButLevels = true;
	}
	if (mainPlayTime>2600 && pkFlagButSecrets == false) {
		this.attachMovie("butSecrets", "butSecrets", this.getNextHighestDepth());
		butSecrets._x = 20;
		butSecrets._y = 100;
		pkFlagButSecrets = true;
	}
	if (mainPlayTime>2900 && pkFlagButMonsterBook == false) {
		this.attachMovie("butMonsterBook", "butMonsterBook", this.getNextHighestDepth());
		butMonsterBook._x = 20;
		butMonsterBook._y = 125;
		pkFlagButMonsterBook = true;
	}
	if (mainPlayTime>3200 && pkFlagButTaroCards == false) {
		this.attachMovie("butTaroCards", "butTaroCards", this.getNextHighestDepth());
		butTaroCards._x = 20;
		butTaroCards._y = 150;
		pkFlagButTaroCards = true;
	}
	if (mainPlayTime>3500 && pkFlagButBosses == false) {
		this.attachMovie("butBosses", "butBosses", this.getNextHighestDepth());
		butBosses._x = 20;
		butBosses._y = 175;
		pkFlagButBosses = true;
	}
	if (mainPlayTime>3800 && pkFlagButMultic == false) {
		this.attachMovie("butMultic", "butMultic", this.getNextHighestDepth());
		butMultic._x = 20;
		butMultic._y = 200;
		pkFlagButMultic = true;
	}
	if (mainPlayTime>4100 && pkFlagButFAQ == false) {
		this.attachMovie("butFAQ", "butFAQ", this.getNextHighestDepth());
		butFAQ._x = 20;
		butFAQ._y = 225;
		pkFlagButFAQ = true;
	}
	if (mainPlayTime>4400 && pkFlagButTech == false) {
		this.attachMovie("butTech", "butTech", this.getNextHighestDepth());
		butTech._x = 20;
		butTech._y = 250;
		pkFlagButTech = true;
	}
	if (mainPlayTime>4700 && pkFlagButInteresting == false) {
		this.attachMovie("butInteresting", "butInteresting", this.getNextHighestDepth());
		butInteresting._x = 20;
		butInteresting._y = 275;
		pkFlagButInteresting = true;
	}
	if (mainPlayTime>5000 && pkFlagButCommunity == false) {
		this.attachMovie("butCommunity", "butCommunity", this.getNextHighestDepth());
		butCommunity._x = 20;
		butCommunity._y = 300;
		pkFlagButCommunity = true;
		delete onEnterFrame;
	}
};
В результате: все работает как надо если запускать swf в плеере( и в среде разработки). В броузере( фокс 1.5) заметно небольшое торможение, которое портит всю динамику. Почитал форум, вроде говорят что onEnterFrame медленно работает....переход на следующий кадр осуществляется после выполнени всего кода в предыдущем.... Решил заменить на setInterval().

Код:
var mainPlayTime:Number = null;
var pkFlagTextPk:Boolean = false;
var pkFlagLine1:Boolean = false;
var pkFlagLine2:Boolean = false;
var pkFlagButHistory:Boolean = false;
var pkFlagButLevels:Boolean = false;
var pkFlagButSecrets:Boolean = false;
var pkFlagButMonsterBook:Boolean = false;
var pkFlagButTaroCards:Boolean = false;
var pkFlagButBosses:Boolean = false;
var pkFlagButMultic:Boolean = false;
var pkFlagButFAQ:Boolean = false;
var pkFlagButTech:Boolean = false;
var pkFlagButInteresting:Boolean = false;
var pkFlagButCommunity:Boolean = false;
function timer():Void {
	mainPlayTime = getTimer();
	if (mainPlayTime>500 && pkFlagTextPk == false) {
		_root.attachMovie("textPainkiller", "textPk", _root.getNextHighestDepth());
		textPk._x = 7;
		textPk._y = 5;
		pkFlagTextPk = true;
	}
	if (mainPlayTime>1000 && pkFlagLine1 == false) {
		_root.attachMovie("lineTextPk", "lineTextPk1", _root.getNextHighestDepth());
		lineTextPk1._rotation = 90;
		lineTextPk1._yscale = 100;
		lineTextPk1._x = 200;
		lineTextPk1._y = 45;
		pkFlagLine1 = true;
	}
	if (mainPlayTime>1500 && pkFlagLine2 == false) {
		_root.attachMovie("lineTextPk", "lineTextPk2", _root.getNextHighestDepth());
		lineTextPk2._yscale = 120;
		lineTextPk2._rotation = -180;
		lineTextPk2._x = 7;
		lineTextPk2._y = 320;
		pkFlagLine2 = true;
	}
	if (mainPlayTime>2000 && pkFlagButHistory == false) {
		_root.attachMovie("butHistory", "butHistory", _root.getNextHighestDepth());
		butHistory._x = 20;
		butHistory._y = 50;
		pkFlagButHistory = true;
	}
	if (mainPlayTime>2300 && pkFlagButLevels == false) {
		_root.attachMovie("butLevels", "butLevels", _root.getNextHighestDepth());
		butLevels._x = 20;
		butLevels._y = 75;
		pkFlagButLevels = true;
	}
	if (mainPlayTime>2600 && pkFlagButSecrets == false) {
		_root.attachMovie("butSecrets", "butSecrets", _root.getNextHighestDepth());
		butSecrets._x = 20;
		butSecrets._y = 100;
		pkFlagButSecrets = true;
	}
	if (mainPlayTime>2900 && pkFlagButMonsterBook == false) {
		_root.attachMovie("butMonsterBook", "butMonsterBook", _root.getNextHighestDepth());
		butMonsterBook._x = 20;
		butMonsterBook._y = 125;
		pkFlagButMonsterBook = true;
	}
	if (mainPlayTime>3200 && pkFlagButTaroCards == false) {
		_root.attachMovie("butTaroCards", "butTaroCards", _root.getNextHighestDepth());
		butTaroCards._x = 20;
		butTaroCards._y = 150;
		pkFlagButTaroCards = true;
	}
	if (mainPlayTime>3500 && pkFlagButBosses == false) {
		_root.attachMovie("butBosses", "butBosses", _root.getNextHighestDepth());
		butBosses._x = 20;
		butBosses._y = 175;
		pkFlagButBosses = true;
	}
	if (mainPlayTime>3800 && pkFlagButMultic == false) {
		_root.attachMovie("butMultic", "butMultic", _root.getNextHighestDepth());
		butMultic._x = 20;
		butMultic._y = 200;
		pkFlagButMultic = true;
	}
	if (mainPlayTime>4100 && pkFlagButFAQ == false) {
		_root.attachMovie("butFAQ", "butFAQ", _root.getNextHighestDepth());
		butFAQ._x = 20;
		butFAQ._y = 225;
		pkFlagButFAQ = true;
	}
	if (mainPlayTime>4400 && pkFlagButTech == false) {
		_root.attachMovie("butTech", "butTech", _root.getNextHighestDepth());
		butTech._x = 20;
		butTech._y = 250;
		pkFlagButTech = true;
	}
	if (mainPlayTime>4700 && pkFlagButInteresting == false) {
		_root.attachMovie("butInteresting", "butInteresting", _root.getNextHighestDepth());
		butInteresting._x = 20;
		butInteresting._y = 275;
		pkFlagButInteresting = true;
	}
	if (mainPlayTime>5000 && pkFlagButCommunity == false) {
		_root.attachMovie("butCommunity", "butCommunity", _root.getNextHighestDepth());
		butCommunity._x = 20;
		butCommunity._y = 300;
		pkFlagButCommunity = true;
		clearInterval(time);
	}
}
var time:Number = setInterval(timer, 30);
В результате тоже самое. Поскольку придумать больше пока ничего не получается, решил тупо увеличить FPS. Хотя понимаю, что вероятно причина в неоптимизированном коде. Увеличил до 50 - тормоза в броузере пропали( во всяком случае динамика стала такой какой задумывалась).
Вопросы:
Как это можно объяснить( что пропали тормоза при увеличении fps)?
Может подскажете что в моем коде неправильно( неоптимально)? И как вообще рашается эта задача: вывод на экран мувиков в определенное время от начала проигрывания фильма?