PotrAs 高速化

週末に時間を作って PotrAs を高速化してみました。

デモ: KANA KEYBOARD (ソース)

使い方:

  • Flash の画面をクリックする
  • キーボードを適当に叩くと文字列が迫ってくる

200px のかな文字を最初にがががっとベクタ化してます。ベクタ化してるので、枠線をつけたり、回転、透明化させたり自由自在。

高速化したところ

特にアルゴリズムには手を入れず、オブジェクトの生成回数や参照回数を減らしただけです。どれも語りつくされてきた手法ですが、実際に速度が速くなるところを目の当たりにするとうれしいものがあります。

例1:for の中で new するのをやめる

for(var i:int = 0; i < 100; i++) {
    var p:Point = new Point();
    // ...
}

var p:Point = new Point();
for(var i:int = 0; i < 100; i++) {
    p.x = 0; p.y = 0;
    // ...
}

例2:関数の戻り値をオブジェクトで返さないようにする

function doHogehoge():Point {
    var ret:Point = new Point();
    // ...
    ret.x = x; ret.y = y;
    return ret;
}

function doHogehoge(p:Point):void {
    // ...
    p.x = x; p.y = y;
}

例3:配列の長さを覚えておく

for(var i:int = 0; i < array.length; i++) {
    // ...
}

var len:int = array.length;
for(var i:int = 0; i < len; i++) {
    // ...
}

これだけで、処理速度がたいたい 2/3 ぐらいになりました。他にも、ループが入り組んでるところで Math.abs をインライン展開したりしたけど、目に見えるほどの効果を感じたのは上の3つぐらいです。

トレース処理は6つの部分から成り立っているのですが、細かな速度変化は次のようになってます。(サンプル画像を10回トレースしたときの所要時間)

  1. path: 1917ms -> 373ms
  2. sums: 265ms -> 269ms
  3. lon: 3115ms -> 2072ms
  4. best: 1102ms -> 798ms
  5. adjust: 3438ms -> 2215ms
  6. smooth: 144ms -> 128ms

もっと最適化の余地はありそうなのですが、ソースコードが機械生成したようになっていくのが悲しいところです。