Что является более эффективным: встраивание FLV или компиляция FLV в SWF и его динамическая загрузка? - PullRequest
2 голосов
/ 05 октября 2009

Недавно я взял на себя довольно сложную задачу - создать интерактивное музыкальное видео для популярного шоу Ghost Whisperer. Я попал в проект поздно и столкнулся с гигантским авторским файлом (длиной около 5000+ кадров). Предыдущий программист (который делал все в AS2) по существу вставил FLV продолжительностью две с половиной минуты на временной шкале времени и в определенные моменты кадра добавлял клипы для интерактивности с базовой функциональностью щелчка мышью, которая заставляла бы эти клипы воспроизводить другие клипы с некоторыми элементами флэш-памяти и некоторыми элементами видео.

(окончательную версию, которую я создал, можно посмотреть здесь http://www.gwghostmagic.com);

Будучи аккуратным уродом, я решил перестроить все это в AS3, полностью обрезать временную шкалу и вместо этого загружать свои элементы во время выполнения, чтобы вместо 5000 кадров у меня был один кадр, а для запуска действий добавлялось Событие. Прослушиватель событий ENTER_FRAME для запуска интерактивности, когда загруженный .swf достигнет определенных кадров. С точки зрения программистов все стало намного понятнее и проще манипулировать определенными действиями. Проблема была в том, что эта штука бежала как дерьмо.

Версия с фреймом 5000+ загружалась быстрее и работала более плавно, чем моя версия AS3. Что приводит меня к вопросу, когда лучше встраивать и запускать временную шкалу, чем запускать прослушиватель событий? Вспышка лучше подходит для функциональности временной шкалы?

Изначально я решил создать и запустить потоковый файл .flv, но синхронизировать действия с .flv было невозможно, потому что .flv работал со скоростью 23,975 кадров в секунду, тогда как мой флэш-фильм работал со скоростью 24 кадра в секунду. Увы, я был вынужден скомпилировать .swf со встроенным FLV. Затем этот .swf был загружен в мой основной файл .swf, который содержал все функции и дополнительные клипы, которые будут воспроизводиться в соответствии с положением кадра загруженного .swf.

Одна вещь, которую я заметил, заключается в том, что Event.ENTER_FRAME, кажется, замедляет работу всего проклятого приложения, потому что в каждом кадре ему приходится выполнять список операторов if длиной 200 строк кода. При этом, если бы все это было встроено, мне может понадобиться только вставить ключевой кадр, в котором будет создан экземпляр интерактивного клипа, а затем он сразу узнает, что делать, а не циклически просматривает операторы if else.

Я облажался, пытаясь сделать вещи красивыми и аккуратными? Лучше позволить вспышке быть вспышкой? Должен ли я искать другую карьеру? Любой вклад приветствуется.

Ответы [ 2 ]

1 голос
/ 05 октября 2009

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

function doThisOnFrame20():void
{
    //do stuff...
}

function doThisOnFrame50():void
{
    //do stuff...
}

var frameFunctions:Array = new Array();
frameFunctions[20] = doThisOnFrame20;
frameFunctions[50] = doThisOnFrame50;

function enterFrameListener(event:Event):void
{
    if(frameFunctions[swfWithFLV.currentFrame] is Function)
    {
        frameFunctions[swfWithFLV.currentFrame]();
    }
}

addEventListener(Event.ENTER_FRAME,enterFrameListener);
1 голос
/ 05 октября 2009

Я думаю, что наличие события запускает каждый кадр, а не только запускает действия, иногда учитывает разницу в производительности. Надеюсь, вы сможете минимизировать количество кода и условий, которые были выполнены в обработчике событий.

Вот идея, которую я не проверял:

var dispatch:Object = {
  f1:   function () {textBubble.text = "This is Rush Hour 2";},
  f61:  function () {textBubble.text = "";},
  f111: function () {textBubble.text = "This scene has 50 takes; "
                     +"Jackie Chan said \"Square Madison\" each time.";},
  f171: function () {textBubble.text = "";}
};
addEventListener(Event.ENTER_FRAME, function (e:event) {
  if (dispatch["f"+e.target.currentFrame] is Function) {
        dispatch["f"+e.target.currentFrame]();
  }
});

При этом объект используется в качестве ассоциативного массива, как описано в живых документах.

...