野心的な比較
SDLの負荷、DirectX直叩きの効率ってのはどんなもんなのか、実行速度と占有メモリは・・・というあたりが気になったので、試してみた。
いつぞやDXRuby0.0.3でためした時のサンプルを開発中の0.0.6用になおして、オブジェクトの数を2000に増やしてみた。
同じく、StarRubyのサンプルを拾ってきて、2000に増やして実行してみた。
なんで2000かというと、テキトーだ。1000程度だとどっちも普通に動いちゃったから。
なんで比較対象がStarRubyなのかというと、機能を限定してシンプルに使いやすく、というスタイルが近いことと、某掲示板でDXRubyの名前が出てきて、StarRubyと比較されて惨敗していたからだ。
うちの環境はWindowsXP、Pentium4 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も使ってるしな。