1

flash.display.Loader クラスを使用して、as3 で記述されたプログラムから swf ファイルをロードしています。FlashDevelop でデバッグ ビルド構成を使用している場合、すべて正常に動作します。しかし、リリース ビルド構成を使用している場合、ローダーが進行状況イベントを送信した後、完了イベントを送信する前に、プログラムが約 2 秒間フリーズします。

これは私のプログラムです:

package
{
 import flash.display.Loader;
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.events.ProgressEvent;
 import flash.net.URLRequest;
 import flash.system.LoaderContext;
 import flash.system.ApplicationDomain;
 import flash.text.TextField;

 public class Main extends Sprite {
  private var frameCounter:int;
  private var frameCounterField:TextField = new TextField;
  private var statusField:TextField = new TextField;

  function Main():void {
   if (stage) init();
   else addEventListener(Event.ADDED_TO_STAGE, init);
  }

  private function init(e:Event = null):void {
   removeEventListener(Event.ADDED_TO_STAGE, init);
   addEventListener(Event.ENTER_FRAME, frame);

   frameCounterField.text = "On frame " + frameCounter.toString();
   addChild(frameCounterField);

   statusField.y = 40;
   statusField.width = 300;
   addChild(statusField);

   var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain, null);
   var urlReq:URLRequest = new URLRequest("SomeFile.swf");
   var loader:Loader = new Loader();

   loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
   loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
   loader.load(urlReq, context);
  }

  private function frame(event:Event):void {
   frameCounterField.text = "On frame " + (++frameCounter).toString();
  }

  private function onProgress(event:ProgressEvent):void {
   statusField.appendText("Progress on frame: " + frameCounter.toString() +
   " Loaded: " + event.bytesLoaded + " / " + event.bytesTotal + "\n");
  }

  private function onComplete(event:Event):void {
   statusField.appendText("Completed on frame: " + frameCounter.toString() + "\n");
  }
 }
}

リリースでは、最初のフレームで次の出力が得られます。

On frame 1

Progress on frame: 1 Loaded: 0 / 182468
Progress on frame: 1 Loaded: 65536 / 182468
Progress on frame: 1 Loaded: 131072 / 182468
Progress on frame: 1 Loaded: 182468 / 182468

プログラムがフリーズする約 2 秒後に行Completed on frame: 2が追加され、「フレーム X で」カウンターがカウントアップを開始します。デバッグ ビルドでも同じ出力が生成されますが、フリーズは発生しません。

ロードしようとしたすべてのswfファイルが問題を引き起こすわけではありません。ファイルのサイズは何にも影響していないようです。別のコンピューターでコンパイルして実行しようとしましたが、同じ結果が得られました。

この問題の原因は何ですか?

編集: プログラムが debug=true でコンパイルされている場合、フラッシュ プレーヤーの起動に約 2 秒かかることに気付きました。これは、debug=false の場合にフラッシュ プレーヤーがフリーズするのと同じ時間です。

4

1 に答える 1

0

これは問題に対する直接的な回答ではありませんが、Flash Player 環境でのローダーの Event.COMPLETE イベントの発生に関する文書化されたエラーがいくつかあります。つまり、プレーヤーの起動直後、およびwmode プロパティが特定の値に設定されている場合です。

デバッガーとリリース バージョンが異なる起動時間または wmode 設定で動作している可能性があるため、これら 2 つのいずれかでバリエーションに違反している可能性があります。

于 2010-04-26T18:35:11.233 に答える