配列を扱うクラスとしてArrayクラスとVectorクラスがあります。
※ Vector クラスは、バージョン Flash Player 10 より使用可能です。
一般的に配列といえば Array クラスを使用しますが
Vector クラスの方が処理速度が早く、メモリ消費量も少なく済みます。
配列データを大量に取り扱うゲームなどに適したクラスと言えます。
Array クラスとの比較で大きく異なる点は
Vector クラスは宣言時にデータ型を指定する必要があることです。
(他にも異なる点がありますが省略します)
Array クラスと Vector クラスの処理速度を比べてみます。
■ Array クラスを使用
■ Vector クラスを使用
■ Vector クラスを使用 ( 配列サイズを固定 )
この3つのパターンでテストしてみます。
var myArray:Array = new Array(); var myVector:Vector.<int> = new Vector.<int>(); var myVectorFixed:Vector.<int> = new Vector.<int>(5000000, true); var i:int; var stime:int; stime = getTimer(); for( i=0; i<5000000; i++ ){ myArray[i] = i; } trace("Array "+(getTimer() - stime)); stime = getTimer(); for( i=0; i<5000000; i++ ){ myVector[i] = i; } trace("Vector "+(getTimer() - stime)); stime = getTimer(); for( i=0; i<5000000; i++ ){ myVectorFixed[i] = i; } trace("Vector Fixed "+(getTimer() - stime));
実行結果は次のようになりました。
サンプルを実行する環境によって数値に違いが出ると思いますが
結果として3つの値に差が出ている点に注目してください。
このことから Array クラスよりも Vector クラスの方が速く
また、サイズを宣言している方がより速くなることが分かります。
次に、メモリの消費量についてテストしてみます。
先ほどのサンプルを3つに分け、それぞれのメモリ消費量を出力します。
例1.Array クラス
var tbl:Array = new Array(); var stime:int = getTimer(); var i:int; for( i=0; i<5000000; i++ ){ tbl[i] = i; } trace((getTimer() - stime) + " mem=" + System.totalMemory);
例2.Vector クラス
var tbl:Vector.<int> = new Vector.<int>(); var stime:int = getTimer(); var i:int; for( i=0; i<5000000; i++ ){ tbl[i] = i; } trace((getTimer() - stime) + " mem=" + System.totalMemory);
例3.Vector クラス (配列サイズを固定)
var tbl:Vector.<int> = new Vector.<int>(5000000,true); var stime:int = getTimer(); var i:int; for( i=0; i<5000000; i++ ){ tbl[i] = i; } trace((getTimer() - stime) + " mem=" + System.totalMemory);
実行結果は次のようになりました。
結果から、サイズを指定した Vector クラスが
もっとも速く、また、メモリ消費量が少ないことが分かります。
もともと Flash を起動する際に結構なメモリを消費するので違いが分かり難いのですが
Array クラスと Vector クラスでは明らかに差が出ています。
Vector クラスを使った場合、使用するデータが大きいほど
メモリ消費を抑える効果があるといえます。
Array クラスには出来て Vector クラスでは出来ないことがあるので
小規模な開発の場合、あまり気にせず Array クラスを使ってもいいと思います。
速度やメモリ消費量が気になりだしたら Vector クラスを使うという
パターンでもいいかもしれません。
作ったゲームを他の人に遊んでもらうと思っているなら、利用可能なところで
Vector クラスを積極的に使いましょう。
プレイする人のマシン環境はそれぞれですから、マシンへの負担が少ないほうが喜ばれます。
アクションやシューティングのようなジャンルでは、特に配慮が必要だと思います。
また、処理速度が気になり始めたのなら配列だけにとどまらず
言語面と、システムの構築面の両方から考えるようにしましょう。
(この件の詳しい話は、また別の機会にしたいと思います)
メモリ消費量に関しては Vector クラスを使うことで消費を抑えることができますが、
もともとのデータが大きくなければあまり気にすることもありません。
扱うデータが大量なときに Vector クラスを使うなどの対策が必要になると思います。
またその他にも、きちんとしたメモリ管理を行うことが大切です。
メモリの確保にあわせて解放を正しく行ったり、データの持ち方を
見直すことでデータ量を減らしたりしましょう。
[ ActionScript 3.0 について ]へ戻る