野心的な比較

SDLの負荷、DirectX直叩きの効率ってのはどんなもんなのか、実行速度と占有メモリは・・・というあたりが気になったので、試してみた。


いつぞやDXRuby0.0.3でためした時のサンプルを開発中の0.0.6用になおして、オブジェクトの数を2000に増やしてみた。
同じく、StarRubyのサンプルを拾ってきて、2000に増やして実行してみた。
なんで2000かというと、テキトーだ。1000程度だとどっちも普通に動いちゃったから。
なんで比較対象がStarRubyなのかというと、機能を限定してシンプルに使いやすく、というスタイルが近いことと、某掲示板でDXRubyの名前が出てきて、StarRubyと比較されて惨敗していたからだ。


うちの環境はWindowsXPPentium4 2.4GHz、GeForce7300GT、メモリ1G。
使ったソースはこれ。

# DXRuby0.0.6(開発中)でのサンプル
require "dxruby"
require "sprite"

# Sprite オブジェクトの配列を生成する。
sprites = Array.new(2000){ Sprite.new }

# Imageオブジェクトを作成
image = Image.load("ruby.png")

# ウィンドウのキャプションを設定する。 
Window.caption = "Sprites"

# fpsを設定する。
Window.fps = 30

# メインループ。
# ウィンドウが閉じられた場合は自動的に終了する。
# 画面は毎フレームリセットされる。
Window.loop do

  # ESC キーが押された場合終了する。
  exit if Input.keyPush?(K_ESCAPE)

  # Sprite オブジェクトそれぞれについて処理する。
  sprites.each do |sprite|

    # Sprite オブジェクトを更新する。
    sprite.update

    # 画像を画面に対して描画する。
    Window.draw(sprite.x, sprite.y, image)
  end
end

結果としては、StarRubyはCPU100%&処理落ちで、DXRubyは70%台で処理落ち無しだった。
これではどのぐらい差があるかはわからないが、とりあえず速いということはわかった。
Windows専用なのだから当たり前だし、Rubyで処理速度の限界に挑戦するようなゲームを作ることはあまり考えられないから、ただの自己満足でしかない。
メモリ使用量を見ると、StarRubyが11Mほど、DXRubyは16Mぐらいだった。
どこでこんなに差がついてるのだろう。
オブジェクトの数を1000増やしても1M程度しか増えないから、内部のスプライト構造体のせいだけじゃなく、DirectXの使い方も違うんだろう。
テキトーに作って動いてるからいいやって思ってたけど、細かい設定とかで非効率的なことをしてるってことなのかな。
D3DXも使ってるしな。