ianime.jsの高速化
2007.11.06
先日公開した、iPhone/iPod touch用アニメーション・ライブラリ「ianime.js」、夕食を食べながらもっと早くできそうなアイデアが浮かんだのでちょっとトライ。これが思い通りの効果を出して、50個のアイコンを特別な効果なしに動かした時のフレームレートを11fpsから15fpsに改善。
iPhone/iPod touchのJavascriptの実行があまりに遅いので、ちょっとでも余計な条件判定やファンクションコールが入るだけで格段に遅くなる。そこを上手に避けながら、かつさまざまなオプション機能を提供する、というのはなかなか難しい。
ちなみに今回のデモは、アイコンの落ちるスピードに少し変化を持たせたベンチマーク。これだとその変化の分だけ遅くなり14fpsほどだが、ちょっとした落ちゲー(「さめがめ」とか「bejewlled」)の効果には十分。「連鎖」だってこなせる^^。
http://satoshi.blogs.com/ianime/test20.html
◇ ◇ ◇
しかし、javascriptのsetIntervalには悩まされてしまった。コールバック関数にthisを渡す方法がなかなか見つからずに、色々と無駄なことをしてしまったのだ。結論から言えば、
var self = this;
setInterval(function() {self.callback();}, 33);
で良かったのだが、この二行にたどり着くまでにいったい何行の無駄なコードを書いたのだろう(短い文章を書く方が時間がかかるというが、プログラムも同じだ)。
どうして
setInterval(this.callback, 33);
や
setInterval(function() {this.callback();}, 33);
ではだめなのかをちゃんと理解している人ってどのくらいいるんだろう?このあたりの「直感的なプログラミングのしにくさ」っていうのがJavascriptの欠点だと私は思っているんだが、どうなんだろう。
はじめまして
一番下のコードのほうは無名のfunctionのthisなんだから、つまりfunctionもオブジェクトであるというJavaScriptの仕様からしたらそのメソッドであるcallback()を呼び出してるのはなんだかヘンな事をしてるなあと言うか不思議な感じがします。
ただ、その上のthis.callback();を渡してる方がうまくいかないのは、まあなんだか直感的じゃあない気はしますね。へぇ意図したように動かないんだ・・・という。
Posted by: rivertop | 2007.11.07 at 05:40