優秀なエンジニアは「入社時のスキルを問わない会社」には就職してはいけない
「au向けのiPhoneは作ってはいけない」という契約になっている(らしい)

ianime.jsの高速化

 先日公開した、iPhone/iPod touch用アニメーション・ライブラリ「ianime.js」、夕食を食べながらもっと早くできそうなアイデアが浮かんだのでちょっとトライ。これが思い通りの効果を出して、50個のアイコンを特別な効果なしに動かした時のフレームレートを11fpsから15fpsに改善。

 iPhone/iPod touchのJavascriptの実行があまりに遅いので、ちょっとでも余計な条件判定やファンクションコールが入るだけで格段に遅くなる。そこを上手に避けながら、かつさまざまなオプション機能を提供する、というのはなかなか難しい。

 ちなみに今回のデモは、アイコンの落ちるスピードに少し変化を持たせたベンチマーク。これだとその変化の分だけ遅くなり14fpsほどだが、ちょっとした落ちゲー(「さめがめ」とか「bejewlled」)の効果には十分。「連鎖」だってこなせる^^。

https://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の欠点だと私は思っているんだが、どうなんだろう。

Comments

rivertop

はじめまして

一番下のコードのほうは無名のfunctionのthisなんだから、つまりfunctionもオブジェクトであるというJavaScriptの仕様からしたらそのメソッドであるcallback()を呼び出してるのはなんだかヘンな事をしてるなあと言うか不思議な感じがします。

ただ、その上のthis.callback();を渡してる方がうまくいかないのは、まあなんだか直感的じゃあない気はしますね。へぇ意図したように動かないんだ・・・という。

Verify your Comment

Previewing your Comment

This is only a preview. Your comment has not yet been posted.

Working...
Your comment could not be posted. Error type:
Your comment has been posted. Post another comment

The letters and numbers you entered did not match the image. Please try again.

As a final step before posting your comment, enter the letters and numbers you see in the image below. This prevents automated programs from posting comments.

Having trouble reading this image? View an alternate.

Working...

Post a comment

Your Information

(Name is required. Email address will not be displayed with the comment.)