Что более эффективно, внедряет FLV или составил FLV в SWF и динамически загружает его?

StackOverflow https://stackoverflow.com/questions/1517589

Вопрос

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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]();
  }
});

Это использует Объект как ассоциативный массив, как описано в живых документах.

Другие советы

Вы, вероятно, правы - запуск более 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top