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