Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   updateAfterEvent (перерисовка) из цикла (for each) (http://www.flasher.ru/forum/showthread.php?t=143993)

Ariel 31.08.2010 01:29

updateAfterEvent (перерисовка) из цикла (for each)
 
Как заставить плеер перерисовывать сцену во время бегущего скрипта в цикле for each?
Уже перепробовал все комбинации с:

1) Созданием таймера и вызовом его e.updateAfterEvent();
2) stage.addEventListener(Event.RENDER, handler);
3) stage.invalidate();

Ничего не помогает. Флэшка намертво цепенеет, пока цикл не отработает.

Какие идеи/советы будут?

kyzi007 31.08.2010 03:24

Бить скрипт на части и выполнять по интервалу (в моем случае это было сжатие энкодером большого количества картинок: сжимала - вызывала по интервалу сохранение следующий).
Пока не выполнится скрипт экран не отрисуется.

Ariel 31.08.2010 07:20

Ясно. Значит, по старинке: onEnterFrame и всё такое?

SunShadow 31.08.2010 08:01

Вам же ясно сказали
Цитата:

Сообщение от kyzi007 (Сообщение 932529)
Пока не выполнится скрипт экран не отрисуется.

Дело в том, что флэш не отрисовывет экран пока идет выполнение кода. Как проверить? Делаем ролик в котором у нас идет движение скажем 100 кадров по прямой из одного угла экрана в другой. Запустите какую нибудь длительную операцию скажем в 3 кадре: это может быть цикл в котором текстовой переменной добавляется по одной букве int.MAX_VALUE. Если у вас комп супер производительный и этого мало можно еще поиск несуществующего символа по строке задать. И я почему то уверен что после 3 кадра флэш надолго зависнет а когда операция будет завершена ваш объект окажется уже в конечной точке.

nOobCrafter 31.08.2010 12:11

Ariel попробуйте изменить принцип перед циклом, приведите анимацию к некой статичной кратинке и далее запускайте цикл, это будет незаметно, я например блюрю фон и вывожу окошко, мол бла бла бла, идет крутой расчет, потом опять запускаете анимацию.

alatar 31.08.2010 13:57

Цитата:

а когда операция будет завершена ваш объект окажется уже в конечной точке.
Когда операция будет звершена объект окажется в состоянии четвертого кадра.

Ariel 31.08.2010 18:38

Да в том-то все и дело, что иногда эти мощные вложенные циклы фигачат дольше 15 секунд... Это никуда не годится ... С этим надо нещадно бороться..

artcraft 31.08.2010 19:09

попробуйте что-то в этом роде: http://www.flasher.ru/forum/showthread.php?t=143906

Psycho Tiger 31.08.2010 19:53

Ariel, от всей души сделал Вам пример.

Этот пример выводит на экран количество посчитанных чисел Фибоначчи. За правильность подсчета этих чисел я не ручаюсь, однако пример отлично иллюстрирует обновление экрана между вычислениями.
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.TimerEvent;
        import flash.text.TextField;
        import flash.text.TextFieldAutoSize;
        import flash.utils.getTimer;
        import flash.utils.Timer;
 
    public class Main extends Sprite
    {
 
                private var _numbers:Vector.<int>;
                private var _timer:Timer;
                private var _textField:TextField;
 
                public static const ONE_PART_OF_TIME:uint = 200;
                private var _time:int;
        public function Main():void
        {
                        _timer = new Timer(100);
                        _timer.addEventListener(TimerEvent.TIMER, operate);
                        _numbers = new Vector.<int>;
                        _numbers[0] = 0;
                        _numbers[1] = 1;
 
                        _textField = new TextField();
                        _textField.autoSize = TextFieldAutoSize.LEFT;
                        super.addChild(_textField);
 
                        operate(null);
                        _textField.text = "Wait...";
        }
 
                private function operate(event:TimerEvent):void
                {
                        _timer.stop();
                        _time = getTimer();
                        while (getTimer() - _time < ONE_PART_OF_TIME) {
                                var l:int = _numbers.length;
                                _numbers[l] = _numbers[l - 1] + _numbers[l - 2];
                        }
                        _textField.text = "Current calculated: " + (l + 1);
                        _timer.start();
                }
 
    }
}



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

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