Как Flash Player загружает основной SWF-файл? - PullRequest
5 голосов
/ 29 ноября 2011

UPDATE:

Кажется, что все не прочитали мой вопрос полностью, все ответы предполагают предварительную загрузку или использование внешних ресурсов. Так что любой желающий ответить, пожалуйста, обратите внимание на жирные вопросы в этом посте. Спасибо!


Я занимаюсь разработкой простого приложения Flash, в котором есть только один SWF-файл. Я хочу, чтобы фильм SWF начал воспроизводиться как можно скорее, поэтому я не собираю для него предварительный загрузчик. Что произойдет, если мой код ActionScript ссылается на ресурсы, которые еще не были загружены?

Например, код заставляет точку воспроизведения переходить от кадра 1 к кадру 20, когда фильм только что был загружен до кадра 10. В таком случае флеш плеер будет?

  • Блокировать выполнение скрипта, остановить воспроизведение, продолжить загрузку с кадра 11 до 20 (без выполнения скрипта), перейти к кадру 20 и вызвать скрипт в этом кадре, когда он загружен?
  • Блокировать выполнение скрипта, остановить воспроизведение, игнорировать загрузку кадра 11 до 19, загрузить кадр 20, перейти к кадру 20 и вызвать скрипт в этом кадре?
  • Игнорировать переход к кадру 20, продолжить выполнение следующих операторов после оператора перехода к кадру 20?
  • Или что-нибудь еще?

Если флэш-плеер не игнорирует переход к кадру 20, любой event срабатывает, когда кадр 20 полностью загружен?

Примечание: Ответы на первый вопрос должны быть сосредоточены на моем примере, охватывать все обстоятельства (например, прикрепить фильм из библиотеки ...) лучше, но не обязательно.

Спасибо!

Ответы [ 5 ]

3 голосов
/ 29 ноября 2011

Flash всегда будет загружать все кадры перед запуском приложения.Однако содержимое кадра может быть загружено не полностью.Так что если у вас есть несколько изображений в кадре 20, они могут не отображаться.

Но в основном вам не следует полагаться на Flash, чтобы загружать вещи для вас - он может делать это в нужном вам порядке, но, возможно, он выиграл«т.Если у вас много ресурсов, и вы переходите от кадра к кадру, вы должны справиться с загрузкой самостоятельно, используя класс Loader.

1 голос
/ 07 декабря 2011

Flash player попытается перейти к кадру 20. Но он будет идти только до загруженных кадров. Так что, если вы скажете, что нужно перейти к 20, а загружено только 10, вы перейдете к 10.

Вызов ресурсов в коде, который не был загружен, либо выдаст ошибку, либо определит этот объект как нулевой. Излишне говорить, что этого следует избегать. Сначала загрузите эти ресурсы.

Хорошим решением является использование аргумента компилятора -frame для создания 2-кадрового флэш-фильма. первый содержит ваш preloader, а второй кадр содержит полное приложение. таким образом, вы можете предварительно загрузить то, что вам нужно, прежде чем потребуется полная функциональность.

Вот пример, как это сделать.

package 
{
    import flash.display.DisplayObject;
    import flash.display.MovieClip;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.events.ProgressEvent;
    import flash.utils.getDefinitionByName;

    /**
     * ...
     * @author Zachary Foley
     */
    public class Preloader extends MovieClip 
    {

        public function Preloader() 
        {
            if (stage) {
                stage.scaleMode = StageScaleMode.NO_SCALE;
                stage.align = StageAlign.TOP_LEFT;
            }
            addEventListener(Event.ENTER_FRAME, checkFrame);
            loaderInfo.addEventListener(ProgressEvent.PROGRESS, progress);
            loaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioError);

            // TODO show loader
        }

        private function ioError(e:IOErrorEvent):void 
        {
            trace(e.text);
        }

        private function progress(e:ProgressEvent):void 
        {
            // TODO update loader
        }

        private function checkFrame(e:Event):void 
        {
            if (currentFrame == totalFrames) 
            {
                stop();
                loadingFinished();
            }
        }

        private function loadingFinished():void 
        {
            removeEventListener(Event.ENTER_FRAME, checkFrame);
            loaderInfo.removeEventListener(ProgressEvent.PROGRESS, progress);
            loaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, ioError);

            // TODO hide loader

            startup();
        }

        private function startup():void 
        {
            var mainClass:Class = getDefinitionByName("Main") as Class;
            addChild(new mainClass() as DisplayObject);
        }

    }

}

Чтобы использовать это, вам нужно добавить аргумент фрейма в вашу сборку. Для этого примера аргумент фрейма будет:

-frame start Main
0 голосов
/ 13 марта 2014

в AS2, попробуйте этот код.Загрузка показывает прогресс в первом кадре, а основной контент - в третьем.Этот код содержится в ссылке на ActionScript 2.0 (getBytesLoaded).http://help.adobe.com/ko_KR/AS2LCR/Flash_10.0/00001304.html#1333866

if (this._framesloaded<this._totalframes) {
    this.gotoAndPlay(1);
} else {
    this.gotoAndStop(3);
}

в AS3, используйте This.

this.loaderInfo.addEventListener(Event.COMPLETE, completeHandler);
0 голосов
/ 08 декабря 2011

Я провел тест с использованием Adobe Flash Professional, чтобы найти ответ на мой вопрос.Каждый желающий может воспроизвести тест, выполнив в Adobe Flash следующие шаги:

  1. Создайте фильм с некоторым кадром, каждый кадр содержит, например, одно изображение и некоторый код ActionScript.
  2. Выберите меню Управление -> Тестировать ролик -> в Flash Professional : будет отображаться проигрыватель отладки
  3. В проигрывателе отладки выберите меню Вид -> Параметры загрузки затем выберите желаемую скорость загрузки
  4. Также в проигрывателе отладки убедитесь, что Bandwidth Profiler и Simulate Download в View menu отмечены.

Если сценарий не меняет точку воспроизведения, Flash Player будет:

  1. Загрузить кадр 1 и дождаться полной загрузки
  2. Перейти к кадру 1
  3. Выполнение сценария в кадре 1
  4. Отображение кадра 1
  5. Выполнение вышеуказанных шагов для кадра 2 и т. Д. (Оставайтесь в кадре 1, пока кадр 2 не загрузится полностью, затем перейдите к кадру 2, выполните скрипт,display ...)

Если сценарий меняет точку воспроизведения, например, переход с кадра 1 на кадр 20, проигрыватель Flash Player:

  1. Продолжает выполнять все операторы сценария вкадр 1 (хотя эти операторы следуют за оператором прыжка) и отображать кадр 1.
  2. Если загружен кадр 20, перейдите к кадру 20, выполните сценарий на нем и отобразите его.Если он не загружен, перейдите к ближайшему загруженному кадру (в моем примере речь идет о кадре 10), но не выполняйте сценарий для этого кадра.
0 голосов
/ 07 декабря 2011

В вашем случае вы должны определить прогрессивный метод загрузки для вашего проекта.

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

первый дисплей только один. После второй загрузки первой и второй .. тогда вы должны управлять

В противном случае вам придется подождать с первого дисплея до следующего, когда загрузка ресурсов дисплея будет закончена. И не показывать предварительный загрузчик на этот раз.

...