Frage

Kürzlich habe ich eine ziemlich entmutigende Aufgabe übernommen, ein interaktives Musikvideo für die beliebte Show Ghost Whisperer zu erstellen. Ich wurde spät im Projekt mitgebracht und wurde mit einer riesigen Autorierungsdatei konfrontiert (über 5000 Frames lang). Der vorherige Programmierer (der in AS2 alles tat) hatte im Wesentlichen ein zweieinhalb Minuten FLV in der Zeit -Zeitlinie eingebettet und an bestimmten Rahmenpunkten Clips für die Interaktivität mit grundlegenden Mausklick -Funktionen hinzufügen, die diese Clips auslösen, um andere Clips abzuspielen mit einigen Flash -Elementen und einigen Videoelementen.

(Die endgültige Version, die ich erstellt habe, kann hier angezeigt werden http://www.gwghostmagic.com);

Als ordentlicher Freak habe ich beschlossen, das Ganze in AS3 wieder aufzubauen, die Zeitlinie ganz zu lenken und meine Elemente eher zum Laufzeit einzuladen, damit ich anstelle von 5000 Bildern einen Frame ausgelöst habe und die Aktionen ein Ereignis hinzugefügt habe. Um die Interaktivität auszulösen, wenn das beladene .swf bestimmte Frames erreicht. Aus dem Standpunkt des Programmierers machte es alles viel klarer und leichter, bestimmte Handlungen zu manipulieren. Das Problem war, dass das Ding wie Mist lief.

Die 5000+ Frame -Version wurde schneller geladen und lief glatter als meine AS3 -Version. Was mich zu der Frage bringt, wann ist es besser, die Zeitlinie einzubetten und zu rennen, als von einem Ereignishörer zu rennen? Ist Flash besser für Zeitlinienfunktionen geeignet?

Zunächst entschied ich mich, ein Streaming zu bauen und aus dem Streaming zu rennen, aber die Aktionen mit dem .flv zu synchronisieren, war unmöglich, da der .flv bei 23,975 fps lief, während mein Flash -Film bei 24 fps lief. Leider war ich gezwungen, ein .swf mit dem eingebetteten FLV zusammenzustellen. Das .SWF wurde dann in mein Haupt .SWF geladen, das alle Funktionen und zusätzlichen Clips enthielt, die gemäß der Rahmenposition des geladenen .SWF spielen würden.

Eine Sache, die mir aufgefallen ist, ist, dass das Ereignis. Enter_Frame scheint die gesamte verdammte Anwendung zu verlangsamen, da es bei jedem Frame eine Liste von IF -Anweisungen von 200 Code -Zeilen lang ablegen muss. Wenn das Ganze eingebettet wäre, muss ich möglicherweise nur einen Keyframe einfügen, in dem der interaktive Clip instanziiert wird, und dann sofort wissen, was zu tun ist, anstatt durchzuführen, wenn sonst Anweisungen.

Habe ich versucht, die Dinge schön und ordentlich zu machen? Ist es besser, Flash Blitz zu lassen? Soll ich eine andere Karriere suchen? Jeder Input wird sehr geschätzt.

War es hilfreich?

Lösung

Ich denke, dass das Ereignis jeden Rahmen ausgelöst hat, anstatt nur Aktionen auszulösen, die gelegentlich den Leistungsunterschied verantwortlich machen. Hoffentlich konnten Sie die Menge an Code und Bedingungen minimieren, die im Event -Handler durchgeführt wurden.

Hier ist eine Idee, die ich nicht getestet habe:

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

Dies verwendet die Objekt als assoziatives Array, wie in den lebenden Dokumenten beschrieben.

Andere Tipps

Sie sind wahrscheinlich korrekt - das Ausführen von mehr als 200 Codezeilen auf jedem Frame verlangsamt Sie. Teilen Sie Ihre Rahmenfunktionen anstelle einer großen Liste von Aussagen auf und rufen Sie nur die, die Sie benötigen. Dies ist eine Erweiterung der Idee von Dlamblin - auf diese Weise führen Sie die kleinste Menge an Code aus, die für jeden Frame erforderlich ist:

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top