トップ «前の日記(2008-02-08) 最新 次の日記(2008-02-11)» 編集

Route 477



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のやつ(ジェネレータ)は主にループ用に用意されてるらしいんですが、 裏技的にコルーチンにも使えちゃうとか。へーへー。

ダウンロード

ていうかなんで突然Fiberなの

お察しください。

普段、単一言語オフしか顔を出してないので、DとかC++とかRubyとかPythonとかさまざまな言語が飛び交うSDLオフは新鮮でした。 あと年齢層バラバラなのに共通の話題で盛り上がれるのは素晴らしいなあとか。

あとはnihaさんがとても若くて年寄りでした(ひどい) 誰かにはさんに体を酷使しないアルバイトを!