より効率的で、FLVを組み込んだり、FLVをSWFにコンパイルして動的にロードしたりしますか?
-
19-09-2019 - |
質問
最近、私は人気のショーGhost Whispererのインタラクティブなミュージックビデオを作成するというかなり困難な仕事をしました。私はプロジェクトの後半に持ち込まれ、巨大なオーサリングファイル(長さ約5000フレーム)に直面しました。以前のプログラマー(AS2ですべてを行った)は、メインタイムラインのタイムメインラインで本質的に2分間のFLVを埋め込み、特定のフレームポイントで、他のクリップを再生するためにそれらのクリップをトリガーする基本的なマウスクリック機能との対話性のためのクリップを追加しましたいくつかのフラッシュ要素といくつかのビデオ要素があります。
(私が作成した最終バージョンはここで見ることができます http://www.gwghostmagic.com);
きちんとしたフリークである私は、AS3ですべてを再構築し、タイムラインを完全に捨てて実行時に私の要素にロードすることにしました。ロードされた.swfが特定のフレームに到達すると、インタラクティブ性をトリガーします。プログラマーの立場から、特定のアクションをより明確かつ容易にすることができました。問題は、物ががらくたのように走ったことでした。
5000以上のフレームバージョンは、私のAS3バージョンよりも速くロードされ、よりスムーズに走りました。イベントリスナーから逃げるよりも、いつ埋め込んでタイムラインから逃げる方が良いのでしょうか?フラッシュはタイムラインの機能により適していますか?
当初、私はストリーミング.flvを構築して実行することにしましたが、.flvが23.975 fpsで実行されているのに対し、フラッシュムービーは24 fpsで実行されていたため、.flvへのアクションを同期することは不可能でした。残念ながら、私はFLVが埋め込まれた.swfをコンパイルすることを余儀なくされました。その後、その.swfは、ロードされた.swfのフレーム位置に従って再生されるすべての機能と追加のクリップを含む私のメイン.swfにロードされました。
私が気づいたことの1つは、event.enter_frameがすべてのフレームで200行のコード長のリストを実行する必要があるため、いまいましいアプリケーション全体を遅くするように見えることです。全体が埋め込まれている場合、インタラクティブクリップがインスタンス化されるキーフレームを挿入するだけで、他のステートメントを循環するのではなく、すぐに何をすべきかを挿入する必要があります。
私は物事を素晴らしく整頓しようとして台無しにしましたか?フラッシュをフラッシュにする方が良いですか?別のキャリアを探すべきですか?どんな入力も大歓迎です。
解決
イベントがアクションのみをトリガーするのとは対照的に、すべてのフレームをトリガーすることは、パフォーマンスの違いを時々説明すると思います。イベントハンドラーで実行されたコードと条件の量を最小限に抑えることができれば幸いです。
これが私がテストしていないアイデアです:
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以上のコードを実行すると、あなたを遅くしています。ステートメントの膨大なリストの代わりに、フレーム機能を分割して必要なもののみを呼び出します - これは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);