トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     for文は重たい?
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
長谷川
Åê¹ÆNo.14344
投稿日時: 2005-1-21 4:43
常連
居住地: 岐阜県
投稿: 84
使用環境:
OS[Windows XP]
ブラウザ[IE]
[Flash MX]
[Dreamweaver MX]
[Fireworks MX]
[FreeHand MX]
for文は重たい?
 最近処理をまとめるためにfor文を使うようになってきたのですが、数行の処理であれば問題なく動くのですが多くなるとあまりの重たさに警告が出て再生が中断されます。for文と普通に書くのではかなり動作の重たさに違いが出るのでしょうか?


例えばこういうことです。

count+=1;
count+=2;
count+=3;

の処理を

for(X=1;X<=3;X++){
count+=X;
}

のようにfor文にまとめた時です。(この作例は簡単構造なので問題無く動いています)
森 なおき
Åê¹ÆNo.14345
投稿日時: 2005-1-21 7:28
モデレータ
居住地: 福岡(心は大阪)
投稿: 527
使用環境:
:MacOSX10.6.8
:FlashCS5.5
Re: for文は重たい?
なおきです。
forの処理中は割り込み処理ができません。
ですので、あまりに時間が掛かると判断された処理の場合は
そのようなメッセージが出るケースがあります。
どの程度の処理をされているのかわかりませんが、
列挙するのと処理そのものの時間に大差はないと思います。
むしろ、その条件を満たさない状況になっていないかを
チェックしてみた方がいいと思います。
存外に間違ってたりしますので(^^;

なお、FlashPlayer5以降だと15秒以上処理が続くと
メッセージが出るようです。


----------------
な お き
Dev.:MacOSX+FlashCS5.5
View:---

空野大二郎
Åê¹ÆNo.14346
投稿日時: 2005-1-21 8:12
職人
居住地: 愛知
投稿: 389
使用環境:
 XP:Home
FlashMX
IE6.0+FlashPlayer7,0,19
CPU:Pentium4 2.26GHz
メモリ:1,024MB
Re: for文は重たい?
 まいど。

 for分やwhile分のループ処理についての過去ログが参考になると
考えられます。
 「ものすごーく時間のかかる処理

 for分で警告が出るということは、CPU負荷が過大にかかる
ということです。それを避けるためにも、ループ回数を少なくする
デザイン計画も必要だと考えられます。


----------------
空野 大二郎 アニメーター作家
桜の道

長谷川
Åê¹ÆNo.14378
投稿日時: 2005-1-21 22:32
常連
居住地: 岐阜県
投稿: 84
使用環境:
OS[Windows XP]
ブラウザ[IE]
[Flash MX]
[Dreamweaver MX]
[Fireworks MX]
[FreeHand MX]
Re: for文は重たい?
 返信ありがとうございます。今日学校の先生に聞いてみたところ同じような回答が返ってきたのでなるほどっと思いました。今まで通りfor文を使わずひたすら羅列してたほうが一番パソコンに優しいみたいですね。

 Flash上の仕様が少し分かった気がするので良かったと思います。色々な事を教えて頂きありがとうございました。
森 巧尚
Åê¹ÆNo.14379
投稿日時: 2005-1-21 23:05
モデレータ
居住地: 宝塚
投稿: 650
使用環境:
.5/CS4/Safari3
XP+2000//IE6
Re: for文は重たい?
引用:
今まで通りfor文を使わずひたすら羅列してたほうが一番パソコンに優しいみたいですね。

正確に言うと、for文が悪いわけじゃないですよ。「一度にものすごくたくさんの処理を行うこと」が問題で、
それが15秒以上もかかってしまうときにメッセージが出るわけです。

もしとても多くの処理しなければいけない場合は、1フレームで一気に行ってしまわないで、
途中で一回解放してイベント処理に戻してやるような設計にすればいいわけです。
「ムービー内のスクリプトが原因でMacromedia Flash Player 7の実行速度が遅く・・・」

for文の中身が軽ければ、普通のループぐらいは大抵なんともないですよ。
ただ、変数処理にバグがあって、
for (X = 1; X <= 3; X++) {
	count += X;
	X = 1;
}

のような構造になっていると延々と処理し続けることになってエラーが出ますが、それはバグですしね。


----------------
森 巧尚
http://www.ymori.com

ひろゆき
Åê¹ÆNo.14383
投稿日時: 2005-1-22 1:57
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: for文は重たい?
森さんも書かれていますが、for文だから重くなるというのではなくて、
「for文で書けば、数行でたくさんの処理を容易にさせることができるので、
大した処理をさせていないようなつもりになる」ことが問題なのではないでしょうか?

つまり、
count+=1;
count+=2;
count+=3;
count+=4;
count+=5;
count+=6;
count+=7;
count+=8;
count+=9;
count+=10;
count+=11;
count+=12;
count+=13;
count+=14;
count+=15;
count+=16;
count+=17;
count+=18;
count+=19;
count+=20;
count+=21;
count+=22;
count+=23;
count+=24;
count+=25;
count+=26;
count+=27;
count+=28;
count+=29;
count+=30;
だと、重そうな処理をさせちゃったな。と感じやすいので、
実際に時間がかかっても、そりゃそうだ。と思うわけですが、
これを、
for(X=1;X<=30;X++){
count+=X;
}
とすれば、これっぽちのことで、なんで重いんだよ。と。

まるで、for文を使ったので重くなったかのような錯覚に陥っているのではないかと。

実際、count+=1; から count+=1000; までを順に書いた処理と
for文で書いた処理で試してみてはいかがですか?
比較をするなら、同じ処理をさせないと。

for文で処理した場合、重く感じるでしょうね。
前者の処理では、途中でスクリプトを書くことすらやめちゃいますから、
感じることすらできないかも。
軽い重いを感じる機会に遭遇しやすいのは、後者の処理の方でしょう。

森 なおき
Åê¹ÆNo.14384
投稿日時: 2005-1-22 2:18
モデレータ
居住地: 福岡(心は大阪)
投稿: 527
使用環境:
:MacOSX10.6.8
:FlashCS5.5
Re: for文は重たい?
引用:

森 巧尚さんは書きました:
ただ、変数処理にバグがあって、
for (X = 1; X <= 3; X++) {
	count += X;
	X = 1;
}

のような構造になっていると延々と処理し続けることになってエラーが出ますが、それはバグですしね。


すんません。これってX=1としてるから
条件をいつまでも満たさないだけでは?
なんか勘違いしてますでしょうか?


----------------
な お き
Dev.:MacOSX+FlashCS5.5
View:---

森 巧尚
Åê¹ÆNo.14385
投稿日時: 2005-1-22 2:37
モデレータ
居住地: 宝塚
投稿: 650
使用環境:
.5/CS4/Safari3
XP+2000//IE6
Re: for文は重たい?
引用:

すんません。これってX=1としてるから
条件をいつまでも満たさないだけでは?

そうです。わざと条件をいつまでも満たさないようにして、エラーが必ず出るようにしている「よくあるバグの例」ですよ。

ループの内側がこんな短ければすぐ気がつきますが、長い場合ついうっかり
「ループ用の変数なのに、別の処理に使ってしまっていてループが終わらなくなる」
ということが起こります。たいしたループじゃないつもりなのにいつまでたっても
終わらないということがあるよという例です。

for文を使うときの注意点ですね。


----------------
森 巧尚
http://www.ymori.com

森 なおき
Åê¹ÆNo.14386
投稿日時: 2005-1-22 2:40
モデレータ
居住地: 福岡(心は大阪)
投稿: 527
使用環境:
:MacOSX10.6.8
:FlashCS5.5
Re: for文は重たい?
ああ、バグというのはプログラムした側のミスという意味での
バグですね。了解しました(^^;


----------------
な お き
Dev.:MacOSX+FlashCS5.5
View:---

空野大二郎
Åê¹ÆNo.14388
投稿日時: 2005-1-22 3:41
職人
居住地: 愛知
投稿: 389
使用環境:
 XP:Home
FlashMX
IE6.0+FlashPlayer7,0,19
CPU:Pentium4 2.26GHz
メモリ:1,024MB
Re: for文は重たい?
 まいど。

 連番スクリプト生成関数を作れば、われわれでも確認できますよ。
1:_rootの1フレーム目、フレームスクリプトに記述
//連番スクリプト生成関数
this.writeScript = function(theNum_str) {
	var i = theNum_str;
	for (i = theNum_str; i < theNum_str+100; i++) {
		var theScript = 'count+=' + i + ';';
		trace(theScript);
	}
};
//フレームレートを1?8くらいに落として実行。(桁抜けが起こる)
startHun_str = 0;//スタート直後の百桁
maxHun_str = 10;//最大の百桁
this.onEnterFrame = function() {
	if (startHun_str < maxHun_str) {
		this.writeScript(1+(100 * startHun_str));
	} else {
		delete this.onEnterFrame;
	}
	startHun_str++;
};
this.stop();

2:trace()関数で出力されたスクリプトをすべて選択し、貼り付ける。
count+=1;
count+=2;
 |
count+=1000;
 (出力では「すべてを選択」メニューがないので、先頭
左クリック&行末[shift]+左クリックですべて選択しましょう。)
引用:
ひろゆきさんは書きました:
実際、count+=1; から count+=1000; までを順に書いた処理と
for文で書いた処理で試してみてはいかがですか?
比較をするなら、同じ処理をさせないと。


 50万回くらいのループだとはっきりと差が出るかもしれませんが、
「出力パネル」の最大桁数は1万行なので、サンプルの「スタート
直後の百桁」、「最大の百桁」を書き換え、徐々にふやして差を
確認してください。


----------------
空野 大二郎 アニメーター作家
桜の道

(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops