2008-02-10
■ [event][Ruby/SDL] Ruby1.9のFiberはゲームにも使えるのか?
結論から言うと、余裕で使える。
今使ってるノートPC (PenM 1.2GHz, メモリ1GB) だと300キャラくらいまで大丈夫な感じです。 大丈夫というのは「描画フレーム数が50/秒以上」とかそんな。
ていうかFiberってなによ
いわゆるコルーチンです。
ふつーのゲームプログラミングでは、敵を「右→下→左→上」という順に動かすために「いま動作のどこまでやったかフラグ」 を用意したりして頑張るんですが、コルーチンがあればこんなに簡単に。
def act_move1(i) @x = rand(640) @y = rand(480) 40.times{ @x += 8; Fiber.yield } # 40回右に動く 40.times{ @y += 8; Fiber.yield } # 40回下に動く 40.times{ @x -= 8; Fiber.yield } # 40回左に動く 40.times{ @y -= 8; Fiber.yield } # 40回上に動く @alive = false end
よかったですね!
かんそう
よいところ
- インスタンス変数が減る
- フラグが減る
- 他の処理と共有しない変数が減る (敵の移動速度 @dx @dy とか。これらは描画に影響しないんで共有不要。)
- 初期化をいろんなところに書ける
- 各Fiber関数(act_*) の冒頭は一度しか実行されないので、ここに初期化処理が書けます。
- たとえば上のdx, dyとか。
- あと描画もFiberにするなら、render関数の冒頭で画像を読み込むとか。
わるいところ
- フラグを消しきれなくてストレスがたまる
- 上のソースでは@aliveとかいうフラグがありますが、これは移動が終わったら描画をオフにするためのものです。ダサい。
- これはしかしまだ工夫の余地がありそう。
- ふつーのゲームプログラミングとなんか違う
- 良くも悪くもなんか違います。慣れたらコルーチンの方が書きやすそうですが。
その他のコルーチン
LuaとかPythonとかTonyuとかに実装されてるという噂。
Pythonのやつ(ジェネレータ)は主にループ用に用意されてるらしいんですが、 裏技的にコルーチンにも使えちゃうとか。へーへー。
ダウンロード
- windows用 Ruby1.9+SDL(最新版)バイナリ
- 最新版はCVSのbranchの方らしいので、自分で落とす人は注意(笑)
- ソースとか
- ごちゃまぜですがfoo.rbがFiber版です(ひどいファイル名だな)。foo2.rbはcallcc版(謎)です。
ていうかなんで突然Fiberなの
お察しください。
普段、単一言語オフしか顔を出してないので、DとかC++とかRubyとかPythonとかさまざまな言語が飛び交うSDLオフは新鮮でした。 あと年齢層バラバラなのに共通の話題で盛り上がれるのは素晴らしいなあとか。
あとはnihaさんがとても若くて年寄りでした(ひどい) 誰かにはさんに体を酷使しないアルバイトを!