概要
以前cocos2d-JS
で作ったbmsjs
をDOM
ベースでmithril.js
で実装してみました。
以下で遊べます。降ってくるのは全部div
要素です。
デモ
http://bokuweb.github.io/bmsjs-ithildin
キーは白鍵が左からZ
,X
,C
,V
が、黒鍵が左からS
,D
,F
がターンテーブルにはB
がアサインされてます。
ソース
なんでわざわざDOMで・・。
当然パフォーマンスを考えればWebGL
使えって話しなんですが、以下の理由により試してみました。
- すべてを
css
でスタイリングしたかった - 勉強のため、また、どれだけ動くか試したかった
すべてをcssでスタイリングしたかった
もともとユーザにテーマを作ってもらいたいと思い、cocos2d-JS
版の時もjson
で設定できるようにスタイル部分を切り出そうとしていたんだけど、これがかなり辛かった。すべてがcss
でスタイリングできるようになればテーマ作ってもらえるんじゃないかと思い着手した。また、cocos2d-JS
はテキスト入力やリスト、ラジオボタンなどを用意するのが大変で、この辺りをreact
やmithril
でやりたかったのも理由のひとつ。
適当な空のdiv
でも予備で複数配置しとけば、background
とかz-index
とか使って自由にオブジェクトを配置できるしかなり利便性もよさそうだった。問題としては、頻繁にリペイントされる要素に複雑なスタイル (box-shadow
など)を当てられるとリペイント時間が増大するんじゃないかってのがあった。
勉強のため、また、どれだけ動くか試したかった
結構動いた。デモも基本的には60FPS出てると思う。(実はreact
版(bokuweb/bmsjs-ithildin at rewite_with_react · GitHub)やfastDOM
版(https://github.com/bokuweb/bmsjs-ithildin/tree/use_fastdom)も作ったんだけどカクつきが一番少ないのはMithril
版だった。この辺りもっと定量的に評価したい。)
ただ、少し踏み外すとカクつきが頻発したりしており、まだまだエフェクトなどを追加する必要があるので自分のスキルではこれ以上はきついんじゃないかと判断した。
じゃあどうすれば
自分の今のスキルと今回の要件を鑑みると、ハイブリッドがいいのではないかと考えている。動きが多く、アニメーションなどを必要とする箇所を必要最低限ピックアップしWebGL
を使用、その他スコアや動いのないオブジェクトなどはDOM
のレイヤーを被せて構成する。これならばパフォーマンスも確保できつつテーマをcss
でスタイリングできる。はず。
案
- react-pixi
- react + cocos2d-JS
- react + phaser
前回使用しているのでreact
+ cocos2d-JS
が一番とっつきやすいかも。
今回活躍したツール
ChromeのEnable paint flashing
今まで知らなかったんですが、描画があった箇所をハイライト(画像の緑枠)してくれる機能です。DevTools の下のペインの「Rendering」タブを選択するとあります。こいつを使うとmithril
版の場合、差分の発生していないはずのDOM(鍵盤のイメージなど)も頻繁にペイントされていることがわかり、{subtree: "retain"}
を返すようにし対策しました。react
版ではそのようなことはなかった。
ChromeのFPSビュワー
Enable paint flashing同様、「Rendering」タブを選択するとあります。こいつをイネーブルにすると画像右上のようにFPSが確認できます。常時60FPSが保てるようこいつで確認しました。
これから
bmsjs
はサーバ側にも多くの課題を抱えているので本格運用はまだまだ先になりそう・・。これからまたcocos2d-JS
を触るとなるとちょっとモチベーション保てなさそうなので、積み残しているtwitterクライントとかElixirの勉強とか(本当はサーバー再度もPhoenix
でやりたい)リフレッシュしてから再開する予定。