iPhoneのブラウザでのアニメーション手法を比較

基本

  • 拡大・縮小を避ける
    • 下記の指定
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;">
      • iPhone4の解像度はiPhone3Gより縦・横に倍大きいが、width=device-widthを指定してもiPhone3Gと同じ320pxが返り、表示時に2倍に拡大されて描画される。style指定で見かけ上の拡大を避けれなくはないが、今回はしない。
    • img.width / img.heighが画像の実サイズと異なる値を入れたり、canvasでの拡大をすると遅くなるのでしない
  • タイマーはまとめる
    • ゲームと同じように1つのループで行う。タイマーを増やすと遅くなるし、canvasならclearRect()が増える。
  • 移動量は経過時間ベースで計算する
    • 遅くなってスムーズさが落ちても、全体の完了時間は変わらないようにする。
  • 少数の位置で描画しない
    • 遅くなるため、CSSのtop, leftやdrawImage()の引数に小数を利用しない。整数化はMath.floor()より~~の方が速い。

比較

iPhone4(MC605J) OS 4.3で比較。

canvas
DOMからinline styleのleft/topを変更
CSS Animationでleft/topを利用
CSS Animationでtranslate()を利用

他のテクニック

canvasでclearRect()を全体にせず、個々のキャラクターの範囲に対して行う
動いてない奴の描画を防ぐためdirty flag等を利用する
  • styleやcanvasに変更など非常に重い処理の前に、動かす必要のある物か判定して、不要なら変更しない。
postMessage()によるsetZeroTimeout()の利用

適切な選択

  • スムーズさを優先するならば、可能な限りCSS Animationでtranslate()を利用するが、やりたいことが制限にひっかかった場合、その制限に応じて、他の奴を選択する