メイン コーダーズルーム【スクリプト系】 ものすごーく時間のかかる処理 | 投稿するにはまず登録を |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
Hamagon | Åê¹ÆNo.6684 投稿日時: 2004-4-28 11:44 |
新米 居住地: 投稿: 25
使用環境:
自作PC Athron1.3Ghz + 512M WindowsXP Flash MX Flash Mx2004proffesional |
ものすごーく時間のかかる処理 例えばこんな感じの処理でして、
function loopProcess() { while(1) { //ここが何百回もループする処理 if( endprocess == true ) { break; } } } こんなふうファンクションの中でずーっとループする処理を組むと、プレイヤーでの実行時に、 「スクリプトのせいでプレイヤーが重くなっています。」 というような警告が出ます。 スクリプトが無限ループしている場合を考慮しての措置だと思うのですが、さて、 その1 パブリッシュ時の設定などでこの警告を出さなくする方法はないのでしょうか? その2 そもそも、このような作り方にするのがわるい、ということなのでしょうが、大量の処理をしながら、時々描画を更新する、というのはどうすればいいのでしょう? FLASHはフレームが進むときに描画が更新されているようですが、functionの中でやりたいことを、フレームを進めながら行う…なんて、もうどうしたらよいやら どなたか助言いただければと思います。 よろしくおねがいします |
かずぃ | Åê¹ÆNo.6685 投稿日時: 2004-4-28 12:07 |
半人前 居住地: 投稿: 49
使用環境:
98SE 10.3 MX |
Re: ものすごーく時間のかかる処理 引用:
Hamagonさんは書きました: それは、できないでしょう。クラッシュするとわかっているものに許可をあたえてしまったら大変ですよ。 引用: その2 たしかに大量のループを設計に取り入れた時点で間違いだとは思いますが、その大量の処理がどのような内容の処理なのか、具体的な記述があればもう少し突っ込んだ議論ができるかもしれませんよ。 |
Hamagon | Åê¹ÆNo.6690 投稿日時: 2004-4-28 12:28 |
新米 居住地: 投稿: 25
使用環境:
自作PC Athron1.3Ghz + 512M WindowsXP Flash MX Flash Mx2004proffesional |
Re: ものすごーく時間のかかる処理 具体的な処理は、「チェスの思考ルーチン」を想像していただければ近いです。
各コマごとに、動かしたときに「チェック」になる手を捜す、みたいな処理です。 なので、一つの駒の処理が終わった時に描画をすればいいとは思うのですが… |
野中文雄 | Åê¹ÆNo.6692 投稿日時: 2004-4-28 12:45 |
ちょんまげら 居住地: 東京 投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1) |
Re: ものすごーく時間のかかる処理 現在は20万回の制限はなくなっていたと思いますので、15秒ルールにひっかかっているのでしょう。
引用: Hamagonさんは書きました: Katoさんが、フレームループと組合わせたループ処理のサンプルを公開されています。 ただループ処理中は、描画はもちろん、ユーザーインタラクションも停止されます。可能であれば、長時間のループを避けるデザインにするのがよいと思います。 |
salvox | Åê¹ÆNo.6854 投稿日時: 2004-5-4 7:07 |
常連 居住地: 東京都 投稿: 73
使用環境:
Windows2000 FlashMX テキストエディター:EmEditor |
Re: ものすごーく時間のかかる処理 FlashのActionScriptは、基本的にはインタープリタ言語なので、Forループや、Whileループが回ってる時には、それしか処理ができないんですよ。特に、Flashに限っては、フレームという時間の制約の中で、一連のスクリプトを処理しなければいけないので、なるべく早く処理を終わらせようと、CPUリソースを相当食います。特にForループにいたっては、Whileループよりも、リソースを食う傾向があるようです。
で、解決策としては、FlashMXやFlash2004を使ってらっしゃるのなら、setInterval()で、更新時間を、ものすごく早くしてスレッドとして、処理させるか、onEnterFrameで、処理させるのが、スマートなやり方だと思います。 onEnterFrameでまわすとフレームに同期して処理が行われるので、『チェスの思考ルーチン』のような場合は、適切ではありませんよね。 おそらく、setInterval()で、更新時間を 1?120ぐらいの間で処理させて、回してる関数の中に、onDone()のような、イベントハンドラを独自に設定して、処理が終わったら、onDone()が呼び出されるような処理にしておけば、処理が終わったのも取得できますよね。 そんなんで、ど?でしょう? もちろん、回す関数内は、ループ文ではなく、if文 + ループカウンターみたいな感じで。
|
youich | Åê¹ÆNo.6860 投稿日時: 2004-5-4 13:08 |
職人 居住地: kobe 投稿: 349
使用環境:
Tiger |
Re: ものすごーく時間のかかる処理 引用:
根本的な解決法じゃないですけど、swf7から[ScriptLimits Tag]がサポートされてるので timeoutとrecursionの回数の変更をしようと思えばできると思います。 おそらくFlashIDE上では設定できないと思いますので(たぶん) swfをassemble,disassemblesできるソフトで書き換えですね。(^^; 引用: 6.ScriptLimits 引用: その2 そういえば、前にsetIntervalを使ったloopの分割をポストしたことがあります。 http://www.flash-jp.com/modules/newbb/viewtopic.php?topic_id=464&forum=6&post_id=2854#forumpost2854
|
Hamagon | Åê¹ÆNo.7448 投稿日時: 2004-5-21 7:06 |
新米 居住地: 投稿: 25
使用環境:
自作PC Athron1.3Ghz + 512M WindowsXP Flash MX Flash Mx2004proffesional |
Re: ものすごーく時間のかかる処理 レスくださった方々、どうもありがとうございました。
しばらくネットにつなげない状況になってしまい、御礼が大変遅くなってしまいました、申し訳ありませんでした。 いただいたご意見を参考にさせていただきます。 |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |
投稿するにはまず登録を | |