土曜に何かゲームがやりたくなったので360でLiveArcade探したら、ょすみんがあったので買ってみた。
で、そこから8時間程ぶっ続けでプレイして、とりあえずスタッフロールが流れる50面までクリアしたけど。
このゲームは無いな。
体験版はせいぜい4色しか出ない所までなので面白いんだけど、5色とかなってくるとだいぶ難しくなり、6色になると人間には不可能だと思えるレベルに!
最初はヒント封印してたけど、6色であきらめて封印解除。以後6色ではずっとヒントに振り回されるだけのプレイになりました。5色でもしんどい。もう、ょすみんは二度とやりたくないくらいはやったよ…。
まったくそんなことやってる場合じゃないのにな!
なんとかプロファイルを取る作業。
CPUカウンタがマルチコアではやばい問題は、Macでは特定のコアでのみ特定のスレッドを実行させるというのは無理なようなので、片方のコアをまるまる無効にしてやってみた。
結果はほぼ変わらず。まあそうだよね。
しかし値がやはりどうにも変なので情報を探してみたら、ruby-profのトラッカーに再帰呼び出しのバグを直すパッチがあがってるじゃないですか。おーこれっぽい。
当てて早速ゲームのプロファイルを取ったらめっちゃ重い。ちゃんと取れたらこんなもんかと1時間以上かけて1ステージ分とったんだけど、出力時にメモリ確保できなくて死にました。あれーずいぶんメモリ食うんだな。
もっと簡単なモデルを表示してアニメーションするだけのプログラムで試したらうまくいった。とおもいきや15MBとかいうhtmlが吐かれてる。数値は以前のようにぶっこわれては無いが、やけにでかい。
アニメーションの1フレーム目だけ描画するようにしたら640KB。これでもでかいけど、同じコードを100回ループすると15MBのログが出るのはおかしいよね。同じ場所を通ってるんだから100回まわしてもログのサイズはほぼ同じじゃないと。
良くみてみるとどうもruby-profの中で認識してるスタックがずれてるっぽくて毎フレームどんどんネストしちゃってる。どこかでスタックのpopが足りてない感じだなぁ。
しかたないのでruby-prof自体のデバッグじゃー。
で、結局、Array#eachの戻りが認識されないことがあるというruby-profの制限なのかバグなのか、ruby本体の仕様なのかバグなのかよくわからないところで落ち着いてしまった。
ruby-profはメソッド呼び出しとその戻りをフックして、メソッドに入ったー、でたー、というのを認識してるんだけど、大域脱出みたいなのをかまされると、メソッドから出たぞイベントが発生しないのでメソッドから出た事を認識できないでいた。
大域脱出ってのは結構簡単に起きるもので、breakとかあるだけでもうダメ。
def foo 1.times do break end end foo puts 'ok'
これでもうおしまい。スタックずれました。ruby-prof的には1.timesの終了が認識されないので、fooの終了時にやっと、timesが終わったことにされ、puts 'ok'はまだfooの中で呼ばれてることになっちゃいます。
さてこれはrubyの仕様なのかバグなのか、はたまたruby-profのバグなのか。
とにかくここまでわかったんだけど、じゃあbreak使うなよっていうのは難しいわな。大域脱出なのでたぶん例外もダメなんだけど、まあこっちはなんとかなるとしても。
うー、どうすればいいんだー。