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

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 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)?
Может подскажете что в моем коде неправильно( неоптимально)? И как вообще рашается эта задача: вывод на экран мувиков в определенное время от начала проигрывания фильма?

Старый 30.03.2006, 01:11
Antares вне форума Посмотреть профиль Найти все сообщения от Antares
  № 2  
Ответить с цитированием
Antares
Banned
[+1 16.05.2006]
[++1 16.05.2006]
[+ 1 21.05.06]
[++ за хамство]
[+1 21.05.2006]
 
Аватар для Antares

Регистрация: Dec 2003
Сообщений: 3,925
Покадровой проверкой. Тормозит не сам onEnterFrame, а навешивание на него лишнего. Если тебе надо не сильно загружающий машину объект вывести -- это тоже вариант.

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

Регистрация: Feb 2006
Сообщений: 580
А как организуется покадровая проверка?

Создать новую тему Ответ Часовой пояс GMT +4, время: 00:00.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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