kumaryu日記
2010-04-05
_ 日記
やる気はあるぜ!
やる気はあるし時間もあるはずなんだが、なぜか手が出せないでいるので何も進んでいないという。
何も進んでないわけではないか…。でも遅いよ。
情報処理技術者試験がもうすぐなので勉強しないとやばいんだけど、エンベデッドの問題集がぜんっぜん売ってない。おかしいくらい売ってない。たまーに1冊くらいゴミみたいなのが売ってるんだけどそれは売ってるうちに数えません。この手の問題集とか参考書ってかなりの割り合いでゴミなので、1冊しか置いてない時点で終わってる。
過去問と解答の解説が載ってるだけのがいいんだけど。過去問は公式に上がってるけどPDFはしんどいからやっぱり紙がいいんですけどねぇ。
_ IronRubyとSilverlightでゲーム
相変わらずあんまり進んでない。
ゲームの処理を進めていくにあたって、途中で切り上げて描画に戻るようなのが必要でやっぱりここはFiberだぜ…ってIronRubyにはFiber無いんですよ。1.8ベースなので。
じゃあスレッドで似たようなのを書くか。特定のメソッド呼ばれたら寝るようなスレッド作ってあげればいい。
しかしSilverlight版のIronRubyだとThread#resumeが無くて、無条件で寝ちゃったら二度と目覚めさせることができない。これは問題あると思うけど無いのは仕方ないので同期オブジェクト使ってなんとかするしか。
条件変数とかMutexとかで同期するのが超めんどくせー!とかやってたんだがQueue使えば実に簡単だった。今時プリミティブな同期オブジェクトを直接触る必要も無いですね。
というわけでupdateを1回呼ぶと登録してたブロックを呼んでくれるGameProcクラスが完成。ブロックの途中でGameProc.yieldを呼ぶと次のupdateが呼ばれるまでそこで寝ててくれる。
えーと、ごめん。ソースは今上げてないのでまた今度。
結構Fiberとは違うんだけど。
- それぞれ別スレッドで動く
- 登録してあるブロック分スレッドが作られる
- 登録してあるブロックが全部いっぺんに動く
特徴はこんな感じ。
別スレッドで動くってのは意外と厳しかったりする。SilverlightだとUIをいじったりするのはメインスレッドからしかできない。なのでGameProcに登録したブロックからpとか使っただけでそのまま固まったりしてしまう。
まあ描画はゲーム内部処理とちゃんと切り離してるからp以外は問題ないんだけどね。
途中で切り上げるのにスレッドを寝かせてるだけなのでどうしても1処理につき1スレッド必要。ついでのそいつらを一気に起こしちゃうのでそれぞれ非同期で動きやがる。
それぞれ非同期で動くのは狙ってやってるから当然なんですが。
嬉しいことにIronRubyのスレッドは本当に非同期で動いてくれるし、Silverlightもマルチスレッドをマルチコアに振ってくれるようなのでパフォーマンス的には非同期にするのはおいしい。あるオブジェクトが他のオブジェクトに影響するようなのが難しくなるんだが、これはメッセージで通信する形がいいんじゃないかと思うのよ。
っていうのを作ったんだけど。
いざゲームの中身をちょこっと書き始めたら、途中まで動かして寝るなんてこと全然やらなかったよ。あれ?使いどころがない…。
これだったら普通にスレッドプールで良かったんじゃないでしょうか。
ところでドキュメント読むとSilverlightでは描画で勝手にマルチコア使ってくれるようなので、頑張ってマルチスレッド化してマルチコア使ってやるぜひゃっはーとか考える必要はあんまりありません。
_ Silverlight4でIronRuby
Silverlight4使いたいんだけど、Silverlight4用のIronRubyビルドできないんだよなーと思ってたらIronRubyの1.0RC4にはちゃんとプロジェクトファイルついてた。Chironもビルドされるっぽい。
しかしChironってdllコピってzipしてるだけなのでべつにいらんと言えばいらないというのをついさっき気付いた。Chiron自体はSilverlight3で使ってるのそのまま使ってなんら問題ないし、最悪Chiron相当の物はRubyでもさっくり作れるじゃん。
それはともかくSilverlight4が使えるのは嬉しいのでとりあえずビルドしてみよう。ゲームでもやっぱりWPFベースのコントロールが(Binding使って素直に)使えると非常に便利なのですよ。
そんなわけでどうにも苦労したがなんとかビルドできた。手順としては、
- Silverlight4のプロジェクト開く
- Silverlight4 Releaseのコンフィギュレーションを選ぶ
- ビルドされる各プロジェクト(Chironはのぞく)のリファレンスパスにSilverlight4のランタイムが入ってるパスとSilverlight4 SDKのライブラリが入ってるパスを追加する
- ビルドする
これでいけるはず。パスを設定しないといけないことが分かってなくてしばらく悩んだが、分かってしまえばまあ当然ではあるね。
Chironはmonoで動くバイナリをどうやってビルドすればいいかわからなかった、というか普通にビルドしたらmonoで起動してくれなかったので従来の物をそのまま使うようにした。それだとMicrosoft.Scripting.Core.dllとMicrosoft.Scripting.ExtensionAttribute.dllはいらないのにxapに入れてくれるんだが、どうせつかわれないので気にせずいれとく。あとSilverlightSDKに入ってるSystem.Numeric.dllが必要なのに入れてくれないので、それはChironのapp.configをいじってなんとか入れるようにする。もしかしたらMicrosoft.CSharp.dllも必要かも。この辺はちゃんと新しくビルドしたChiron使えれば勝手にやってくれるから問題ない。
というところまでやるとやっと動くようになるよ!あとはいつもどおりChironすればいいだけ。
とりあえず動かしただけでもう寝る時間になったので、Silverlight4で結局何が出来るのかはまた明日。