2

最近、人気番組「ゴーストウィスパラー」のインタラクティブミュージックビデオを作成するという、かなり大変な作業を引き受けました。私はプロジェクトの後半に連れてこられ、巨大なオーサリングファイル(約5000フレーム以上の長さ)に直面しました。以前のプログラマー(AS2ですべてを行った)は、基本的にタイムメインタイムラインに2分半のFLVを埋め込み、特定のフレームポイントで、他のクリップを再生するようにそれらのクリップをトリガーする基本的なマウスクリック機能との対話性のためにクリップを追加しましたいくつかのフラッシュ要素といくつかのビデオ要素で。

(私が作成した最終バージョンはここhttp://www.gwghostmagic.comで見ることができます);

きちんとしたフリークなので、AS3ですべてを再構築し、タイムラインを完全に破棄し、実行時に要素をロードして、5000フレームの代わりに1つのフレームを作成し、アクションをトリガーしてEvent.ENTER_FRAMEイベントリスナーを追加することにしました。ロードされた.swfが特定のフレームに到達したときに対話性をトリガーします。プログラマーの観点からは、特定のアクションを操作するためにすべてがはるかに明確で簡単になりました。問題は、物事ががらくたのように実行されたということでした。

5000+フレームバージョンは、私のAS3バージョンよりも高速にロードされ、スムーズに実行されました。イベントリスナーから実行するよりも、タイムラインを埋め込んで実行する方が良いのはいつですか?フラッシュはタイムライン機能に適していますか?

当初、ストリーミング.flvをビルドして実行することにしましたが、.flvが23.975 fpsで実行されていたのに対し、フラッシュムービーは24 fpsで実行されていたため、アクションを.flvに同期することはできませんでした。残念ながら、flvを埋め込んだ.swfをコンパイルする必要がありました。次に、その.swfがメインの.swfに読み込まれ、読み込まれた.swfのフレーム位置に従って再生されるすべての関数と追加のクリップが含まれていました。

私が気づいたことの1つは、Event.ENTER_FRAMEは、フレームごとに200行のコード長のifステートメントのリストを実行する必要があるため、アプリケーション全体の速度を低下させるように見えることです。ここで、すべてが埋め込まれている場合は、インタラクティブクリップがインスタンス化されるキーフレームを挿入するだけで、if elseステートメントを循環するのではなく、すぐに何をすべきかがわかります。

私は物事を素敵で整頓しようとして失敗しましたか?フラッシュをフラッシュにしたほうがいいですか?私は別のキャリアを探すべきですか?どんな入力でも大歓迎です。

4

2 に答える 2

1

アクションをトリガーするだけではなく、イベントをフレームごとにトリガーすることで、パフォーマンスの違いが生じる場合があると思います。うまくいけば、イベントハンドラーで実行されたコードと条件の量を最小限に抑えることができます。

これは私がテストしていないアイデアです:

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

これは、ライブドキュメントで説明されているように、オブジェクトを連想配列として使用します。

于 2009-10-04T23:00:29.707 に答える
1

あなたはおそらく正しいです-すべてのフレームで200行以上のコードを実行すると、速度が低下します。ステートメントの膨大なリストの代わりに、フレーム関数を分割し、必要なものだけを呼び出します-これはdlamblinのアイデアの拡張です-このようにして、各フレームに必要な最小限のコードを実行します。

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);
于 2009-10-05T02:05:18.803 に答える