Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Флэшка перестает тормозить при увеличении FPS. Почему? (http://www.flasher.ru/forum/showthread.php?t=77676)

pkfun 30.03.2006 00:10

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

Antares 30.03.2006 01:11

Покадровой проверкой. Тормозит не сам onEnterFrame, а навешивание на него лишнего. Если тебе надо не сильно загружающий машину объект вывести -- это тоже вариант.

pkfun 30.03.2006 01:56

А как организуется покадровая проверка?


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

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