2011-04-15 10 views
1

これは私の問題です:私はループで修正されたいくつかの表示オブジェクトを持っていますが、各ループの最後に1つのフレームを正確にレンダリングすることを望みます。ループの持続時間は予期しないほど変化する可能性があるため、一定のフレームレートはそれを実行しません。ActionScriptでレンダリングを停止する

私は、0msタイマーでupdateAfterEventを使用して、各ループの最後に1つのフレームをレンダリングするハック方法を発見しました。今度は、Flashがループの途中でフレームをレンダリングしないようにします。これは時間とリソースの無駄であり、奇妙な点滅の効果を作り出します。フレームレートを0に設定するのは簡単な解決策ですが、stage.frameRateの最小値は0.01です。

質問1:標準のレンダリングループを適切に停止する方法はありますか? 回避策は有効な答えとはみなされません。なぜなら私が現在行っていることは、かなり良い回避策(100秒ごとに1フレームが耐えられる)であるからです。

質問2:レンダリングを強制するためにupdateAfterEventよりも良い方法はありますか?

おっと、私は機会を忘れました。おはようございます/午後、よろしくお願いします。

+0

はあなたが詳細にあなたの問題を理解するためにいくつかのコードを提供していただけます。

は次のようになります。私はあなたの質問は、Flexの検証のライブサイクル(私は 'invalidateDisplayList()など)を意味しますが、確信していないと思う。 – Constantiner

答えて

1

updateAfterEventを使用して次回のスケジュールされたレンダリング更新を先に強制するのに問題はありませんが、無駄なタイマーは望ましくありません(関数呼び出しが多すぎます)。代わりに、独自のレンダーイベントをループの終わりにディスパッチして、リッスンし、updateAfterEvent()を呼び出します。

私たちが話していることがfor、whileなどのループであれば、ループの途中でレンダリングされるものは表示しないでください。同期コードの実行中にFlashがレンダリングされません。その部分は私のコード内で実際に何が起こっているのだろうかと思っています。

+0

"同期コード実行中にFlashがレンダリングされない" updateAfterEventsを使用しなくても、Flashは表示オブジェクトをレンダリングすることを保証できます。それは長い間連続して実行するループ(yes、whileループ)なので、コード実行中に実行する必要があります。私はFlashがコードの実行を一時停止すると思いますが、ループのどこかで(私が "ループの途中で"呼び出す)コードを実行します。 私自身のイベントの派遣についてアドバイスをいただき、ありがとうございます。 – Grimy

1

これはさまざまな方法がありますが、これはFlash内の制限ではなくデザイン全体の問題と思われます。私は長いループが悪い考えであると思います。フルコントロールが必要な場合は、現在のオブジェクトをDisplayListにアタッチするのではなく、すべてのウィンドウをオフスクリーンでレンダリングします。これには、添付されていないスプライトにすべてを追加する必要があります。必要なときに描画します。ここでの欠点は、あなたがマウスイベント/キーボードイベントを取得しないことです。

var bmp:BitmapData = new BitmapData(800,600,true); 
var container:Sprite = new Sprite(); 

// add all your display objects to the container 

stage.addChild(new Bitmap(bmp)) 

// render loop 
for each (var dsp:DisplayObject in objects) { 
    // stuff 
} 

// clear our bitmap 
bmp.fillRect(bmp.rect, 0); 
bmp.draw(someContainer); 
関連する問題