Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
2009-06-24

[Ruby]Rubyはそんなに遅くない

ゲーム開発環境としてRubyが遅いと言われるとどうにも納得がいかないので、 下のようなスクリプトで実験。

1000個のスプライトを作成し、スプライトそれぞれを移動、 壁との跳ね返り、自機とのあたり判定を行っている。 秒間60フレームを想定して60回実行する。

$hit_counter = 0

class Sprite
  attr_accessor :x, :y, :vx, :vy
  def initialize(x, y)
    @x, @y = x, y
    @vx, @vy = 1, 1
  end
end

def run(sprites)
  ship = Sprite.new(10, 10)
  60.times do
    sprites.each do |e|
      e.x += e.vx
      e.y += e.vy
      e.vx *= -1 if e.x < 0 or e.x > 100
      e.vy *= -1 if e.y < 0 or e.y > 100
      if ship.x == e.x and ship.y == e.x
        $hit_counter += 1
      end
    end
  end
end

require 'benchmark'
sprites = Array.new(1000) { Sprite.new(0, 0) }
puts Benchmark.realtime { run(sprites) } 

手元のPC(Core2 CPU 6400 @ 2.13Ghz 上の ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-cygwin])で動かした結果、かかった時間は、

0.180000066757202

である。1.0だとギリギリ秒間60回まわせると言うことになるので、まだだいぶ余裕がある。

ちなみに別のPCで計測すると、

0.189450025558472    # ruby 1.8.7 (2009-04-08 patchlevel 160) [i686-linux]
0.0885939598083496   # ruby 1.9.1p0 (2009-01-30 revision 21907) [i686-linux]

という結果に。さすが1.9は速い。

上記処理で負荷の1〜2割程度と言うと、 1000個のキャラクターを凝った動かし方にするのは厳しいと思うけど、 数十から数百個レベルなら問題ないんじゃないかな。 描画ライブラリが十分に速ければ。 ライブラリはCで実装できるから十分な高速化が可能だろうし。 良く知らないのだけど速度的な意味では今時の携帯ゲーム機と同じくらいなんじゃないかな? (いやPSPは圧倒的に速そうだな……)

やっぱり古い環境を知っているからRubyは遅くないって思ってしまうんだろうな。 でも過去の名作ゲームにはもっとずっと厳しい環境で作られてきたものがたくさんあるはず。

(GCで止まるとかはまた別の話。)