ActionScript 3.0で始めるオブジェクト指向スクリプティング

第54回 【特別編】配列の処理をVectorオブジェクトで最適化する

この記事を読むのに必要な時間:およそ 4 分

このたび技術評論社より,拙著ActionScript 3.0パフォーマンスチューニングが発売される。ActionScript 3.0の処理をいかに軽く,あるいは速くするかという技術やコツの解説だ。そこで,本連載の特別編として,著書からいくつかのネタを紹介してみたい。なお,連載の本編も並行して進める。

初めのネタとして採上げるのはVectorクラスだ。第42回「Vector3Dクラスの3次元空間座標とインスタンスへの描画」Vectorクラスと3次元空間から2次元平面への変換では,⁠VectorはいわばArrayを最適化したクラスだ」と紹介した。配列を使った処理がVectorオブジェクトで置換えられるなら,その方がお得だ。ただ,置換えにちょっとした工夫が要る場合もある。その例と,Vectorオブジェクトで最適化するコツをご説明したい。

Vectorクラスのおさらい

まず,Vectorクラスについておさらいしておこう。Vectorクラスを使おうとするとき,配列つまりArrayクラスとは違うふたつの条件があった(前出第42回「Vector3Dクラスの3次元空間座標とインスタンスへの描画」参照)⁠この第2の条件については,次項以降で考えたい。

Vectorクラスを使うための条件
  1. エレメントにひとつのデータ型を定める
  2. インデックスが連番になる

もうひとつ触れておきたいのは,エレメントを予め納めたVectorインスタンスのつくり方だ。第44回ワイヤーフレームの立方体を回す「立方体のワイヤーフレームを描く」で,Flash Professional CS5から使えるつぎのシンタックスをご紹介した。

  • new <ベース型>[エレメント0, エレメント1, …, エレメントN]

では,Flash CS4 Professionalではどうしたらよいかというと,Vector()コンストラクタメソッドにはエレメントが引数として渡せない。したがって,インスタンスをつくってから,Vector.push()メソッドでエレメントを加えることになる。

  • Vectorオブジェクト.push(エレメント0, エレメント1, …, エレメントN)

もっとも,1行のステートメントで,エレメントを予め納めたVectorインスタンスがつくれないことはない。Vector()関数を使うやり方だ。

  • Vector.<ベース型>([エレメント0, エレメント1, …, エレメントN])

引数に渡しているのは,必要なエレメントを納めた配列だ。Vector()関数は,その配列をVectorオブジェクトに変換する。個人的には,この書き方の方が,CS5のnew演算子を使うシンタックスよりも見た目の違和感が少ない。しかし,配列からVectorにオブジェクトを変換するというのは,負荷がどうしても高くなる。今回のテーマである最適化にはそぐわない。

配列でキーコードとプロパティを扱った例

さて,これから本題だ。配列からVectorクラスを使った処理に書替えるお題として,第15回配列を使ったキーコードとプロパティの扱いでつくったスクリプトを採上げよう。インスタンスを上下左右の矢印キーで動かすムービーだ図1)⁠

図1 インスタンスを上下左右の矢印キーで動かす

図1 インスタンスを上下左右の矢印キーで動かす

第15回スクリプト2は,上下左右の矢印キーによる操作を配列で切り分けた。各矢印のキーコードのインデックスに,それぞれ操作するプロパティ(文字列)と移動方向(数値)を入れ子の配列にしてエレメントに納めておく。そして,キーボードのキーが押されたとき,配列からそのキーコードのエレメントを取出し,そのデータにもとづいて操作している。

第15回スクリプト2 操作するプロパティを配列のキーコードのインデックスに定める(再掲)

// MovieClip: キー操作で動かすインスタンス
var nMove:int = 1;
var nShiftMove:int = 10;
var keys_array:Array = new Array();
keys_array[Keyboard.LEFT] = ["x", -1];
keys_array[Keyboard.RIGHT] = ["x", 1];
keys_array[Keyboard.UP] = ["y", -1];
keys_array[Keyboard.DOWN] = ["y", 1];
stage.addEventListener(KeyboardEvent.KEY_DOWN, xKeyDown);
function xKeyDown(eventObject:KeyboardEvent):void {
  var nKeyCode:int = eventObject.keyCode;
  var bShiftKey:Boolean = eventObject.shiftKey;
  xMove(nKeyCode, bShiftKey);
}
function xMove(nKeyCode:int, bShiftKey:Boolean):void {
  var key_array:Array = keys_array[nKeyCode];
  if (key_array) {
    this[key_array[0]] += key_array[1] * xGetPixels(bShiftKey);
  }
}
function xGetPixels(bShiftKey:Boolean):int {
  var nPixels:int = bShiftKey ? nShiftMove : nMove;
  return nPixels;
}

このスクリプトは,操作するキーのコードとその内容をすべて配列にまとめた。そのため,押したキーが何かを条件判定することなく,キーコードのインデックスに配列エレメントがあれば,そのデータにもとづいて処理している。キー操作についてのデータがわかりやすくまとまっていて,押されたキーの処理(関数xMove())も極めてシンプルだ。

ところが,速さでは条件判定の処理の方が勝る。具体的には,switchステートメントを用いた第14回キー操作とif以外の条件判定スクリプト2の方が,前掲第15回スクリプト2より速い。そこで,配列をVectorオブジェクトに置換えることによって,処理速度を高めてみよう。

著者プロフィール

野中文雄(のなかふみお)

ソフトウェアトレーナー,テクニカルライター,オーサリングエンジニア。上智大学法学部卒,慶応義塾大学大学院経営管理研究科修士課程修了(MBA)。独立系パソコン販売会社で,総務・人事,企画,外資系企業担当営業などに携わる。その後,マルチメディアコンテンツ制作会社に転職。ソフトウェアトレーニング,コンテンツ制作などの業務を担当する。2001年11月に独立。Web制作者に向けた情報発信プロジェクトF-siteにも参加する。株式会社ロクナナ取締役(非常勤)。

URLhttp://www.FumioNonaka.com/

著書

コメント

コメントの記入