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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     switch や if での場合分けの上限数
投稿するにはまず登録を

スレッド表示 | 古いものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
Fla4man
Åê¹ÆNo.28896
投稿日時: 2006-9-24 18:47
職人
居住地: かまくら
投稿: 517
使用環境:
WinMe,Win2000,
Flash4,アズさん,大仏、delphi
Re: switch や if での場合分けの上限数
とりあえず元スレの話はもっぱらコンポーネント関連だということでおちついたことなので
質問の文字通りの説明をさせてもらいます。

命令のブロック長をあらわすaction_lengthが16bitということでバイトコードが16bitということではありません。
無論「クラスのバイトコード」という概念も存在しません。

オープンソースであるFlash movie formatのバイトコードは基本1byteで各種構造体で定義しています。
スクリプトブロックもまず1byteで定義されます。
リンク先のサイトは「ASを組むうえでの結果論」としてはある程度参考になりますが
基本的なコーディング能力を伴なった論議は皆無といっていいので
ほとんど参考にはならないと思います。(ex.メモリ関連のはなしなど)

そもそもFlash move Formatはいわゆるバイトコードエンジンではありません。

純然たるバイトコードエンジンたるアドビVM2用のバイナリーを吐き出すFlex2とは全く別の存在で
AS3とはテキストで表現された言語でありバイトコードマシンとセットではありますがAS3自体現状のFlashに展開できる事を考えると
AS3=VM2用バイトコードという等号は成り立たないと思います。
従ってフォーマットとしてみてFlash Movie Formatのスクリプトとは全く関係ないので「拡張」という単語は不適切です。

話を戻します。
リンク先の話は命令ブロック長の16bit制限に基づく話なわけですが

if文とswitch文については別の16bit制限があります。

基本的にSWF movie formatにはswitch文は存在しません。
全てif文同様branch文とbranchiftrueに展開されます。
branch命令はオペランドが16bit型なので±32kbyteまでしかジャンプできないという問題があります。
これはラベルの数でも命令の数でもなくバイトの長さ直接です。
前後に自由に飛べます。
ゆえにFlashlite1.0はFlash4互換なのにfor やswitchが言語としては可能だったわけです。

ジャンプはラベル数でも命令数でもなくてバイト長なので
実際に直接文字列の長いものが挿入されるとエラーになります。

Flash4だと定数を使わないので変数に長文を入れればエラーがでやすいのですがエラーコードは出さず間違ったコードを吐き出します。
Flash5以降は文字列は原則インスタンスの先頭で定数宣言するので1バイトないしは2バイトで表現します。

switch文を展開した場合
しょっぱなの比較文からブロックの終わりまでが32kbyteあると
FlashIDEが利口でなければ多分うまく動くコードを吐かないかエラーになるかだと考えられます。
つまり最悪if文1個でもうまくコードが生成できない可能性があるということです。

しかしコンパイラが妥当にコードを組む能力があれば長い文字列長がなければ
branch命令で継ぎ足して長さはいくらでも増やすことが出来ます。

また比較処理のブロックを関数化すれば比較文自体短く出来ます。
この方法は特に多数を均一にアクセスするswitchの実実装に使えますが
管理しやすさやや速度アップの点からも複雑な構成のムービーでは使用を考慮すると良いと思われます。


----------------
通常のハンドル名:×○○× ねた回収モードに突入 現在1/100

kumakuma
Åê¹ÆNo.28893
投稿日時: 2006-9-24 13:41
新米
居住地:
投稿: 14
使用環境:
WinXP
Flash 8 Professional
Re: switch や if での場合分けの上限数
みなさんこんにちは。

addItem(); を dataProvider でやったところ

もともと4600行ぐらいあったものが400行ぐらいに減りまして、正常に機能しました。

ifの数は最初の通り(50個)で問題なく動くようになりました。

Excelで一度に編集していたのでスクリプトエラーはなかったと思われますので、addItem() がおおすぎたのかな とおもっています。if の中には最大で200個ぐらいのaddItemが入っているのもありましたんで。。。


どうもありがとうございました。
野中文雄
Åê¹ÆNo.28892
投稿日時: 2006-9-24 10:56
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: switch や if での場合分けの上限数
ifswitchはわかりませんけど、Flash 8まではクラスのバイトコードに32KBの制限が
あります。

参考: [Flashcoders] Bytecode limit for class should bot be more then 32k

これは、Flashがバイトコードに16-bitを用いているためで、ActionScript 3.0では24-bitを使うことにより8388KBにまで拡張されるそうです。


----------------
 

テライユタカ
Åê¹ÆNo.28891
投稿日時: 2006-9-24 10:32
常連
居住地: わかやま
投稿: 88
使用環境:
iMac G5 10.4.9 + iBook G4 10.3.9 + Flash8
Re: switch や if での場合分けの上限数
上限数はあるみたいです。
僕も以前陥りました。

ML過去ログ:if文の行数上限


----------------
TERAI YUTAKA
HomePage: SITE ALPHA

kumakuma
Åê¹ÆNo.28882
投稿日時: 2006-9-22 15:56
新米
居住地:
投稿: 14
使用環境:
WinXP
Flash 8 Professional
Re: switch や if での場合分けの上限数
どうもありがとうございます。

やりまして。。最初の if構文が機能しなくなるというところに戻っていたわけです。


教えていただいた方法でできそうです。
additem() をdataProvider におきかえてみます。

ありがとうございました。
森 巧尚
Åê¹ÆNo.28881
投稿日時: 2006-9-22 15:19
モデレータ
居住地: 宝塚
投稿: 650
使用環境:
.5/CS4/Safari3
XP+2000//IE6
Re: switch や if での場合分けの上限数
引用:

kumakumaさんは書きました:
つねに undefined になるのでひとつひとつlabel と data を両方設定できる additem() でやりまして。。。

「やりまして。。。」どうなったのですか???
addItemではうまくいったのですか?
もうすこし具体的にお願いします。

dataの設定をしていないからundefinedになるのは当然です。
dataを使うならdataの値を設定しないといけません。
var Llist = ["A", "D", "G"];
var Dlist = ["1", "2", "3"];
d_array = [];
for (i = 0; i < Llist.length; i++) {
	d_array[i] = {label:Llist[i], data:Dlist[i]};
}
my_cb.dataProvider = d_array;


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

kumakuma
Åê¹ÆNo.28880
投稿日時: 2006-9-22 14:57
新米
居住地:
投稿: 14
使用環境:
WinXP
Flash 8 Professional
Re: switch や if での場合分けの上限数
こんにちは

dataProvider は使おうとやってみたんですが、
label項目がかなりランダムなので

var list = ["A","D","G"];
my_cb.dataProvider = list;

のようにして設定したかったのですが、
data の部分を操作できなくなってしまい
つねに undefined になるのでひとつひとつlabel と data を両方設定できる additem() でやりまして。。。
森 巧尚
Åê¹ÆNo.28873
投稿日時: 2006-9-22 1:58
モデレータ
居住地: 宝塚
投稿: 650
使用環境:
.5/CS4/Safari3
XP+2000//IE6
Re: switch や if での場合分けの上限数
引用:

kumakumaさんは書きました:
2000行の内95%は

残りの5%がどのような処理なのかが大きな問題ですね。

しかし、95%もaddItemを使っているのなら、少なくともそこはループで処理できるのではないでしょうか。

例えば、a_cboというコンボボックスに2000回addItemをするならこのようにできます。
for (i = 0; i < 2000; i++) {
	a_cbo.addItem("Item" + i, i);
}


でも、コンボボックスを使っているのなら、1つ1つaddItemするよりも、
あらかじめ配列にデータを入れておいてdataProviderを使えば10倍ぐらいの速さで処理できると思います。
d_array = [];
for (i = 0; i < 2000; i++) {
	d_array[i] = {label:"Item" + i, data:i};
}
a_cbo.dataProvider = d_array;


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

kumakuma
Åê¹ÆNo.28871
投稿日時: 2006-9-22 1:36
新米
居住地:
投稿: 14
使用環境:
WinXP
Flash 8 Professional
Re: switch や if での場合分けの上限数
KURAGEさん森さんありがとうございます。
お世話になります。

if処理自体が行われるかとうかちょっと判断する技術をもっていないのですが、2000行の内95%は

addItem("項目",1);

のような行です。
これが多すぎるんでしょうか。。
森 巧尚
Åê¹ÆNo.28870
投稿日時: 2006-9-22 1:26
モデレータ
居住地: 宝塚
投稿: 650
使用環境:
.5/CS4/Safari3
XP+2000//IE6
Re: switch や if での場合分けの上限数
単純に行数だけなら、if文を3000行ぐらい並べてみましたが、ちゃんと最後まで動きました。

ですが、コンボボックスに対して何かをしようとしているのであれば、さらにそのコンボボックス内でも何かの処理を行なうために処理が重くなってしまっているのではないでしょうか?

そもそも2000行ものスクリプトは多すぎますね。動かない原因が、もしどこかにバグが隠れているためだったとしても、そこを見つけ出すのは人間として大変ですよね。
同じような処理を繰り返している部分があるはずですから、ループ処理で対応するなど方法を考え直したほうがいいように思います。
もし、処理回数に問題があるのならば、処理回数を減らすなどして対策を考えることも試行錯誤しやすくなりますし。


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

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

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