2008-04-17
Ruby/SDLとStar Rubyの描画速度比較
Star Rubyの描画速度を知りたかったので、 次のようなコードでRuby/SDLと速度を比較した。
Ruby/SDLのコード
引数で画像ファイル名を受け取り、その画像をロードして描画。 5000×60回描画を繰り返す。 第2引数でモードを受け取り、モードに応じて通常描画、アルファ処理、回転、拡大処理を行う。
# sdl_bench.rb require 'sdl' SCREEN_W = 256 SCREEN_H = 256 SDL.init(SDL::INIT_VIDEO) screen = SDL.setVideoMode(SCREEN_W, SCREEN_H, 16, SDL::SWSURFACE) image = SDL::Surface.load(ARGV.shift) image.setColorKey(SDL::SRCCOLORKEY, image.getPixel(0,0)) image = image.displayFormat x, y = 50, 50 render = lambda { SDL.blitSurface(image, 0, 0, 0, 0, screen, x, y) } case ARGV.shift when 'alpha' image.set_alpha(SDL::SRCALPHA, 50) when 'angle' angle = 18 render = lambda { SDL.transform_blit(image, screen, angle, 1, 1, 0, 0, x, y, 0) } when 'scale' scale = 2.0 render = lambda { SDL.transform_blit(image, screen, 0, scale, scale, 0, 0, x, y, 0) } end t = Time.now 60.times do screen.fillRect(0, 0, SCREEN_W, SCREEN_H, [0, 0, 128]) 5000.times(&render) screen.updateRect(0, 0, 0, 0) end p Time.now - t
Star Rubyのコード
機能はRuby/SDL版と同じ。
# star_bench.rb require "starruby" include StarRuby texture = Texture.load(ARGV.shift) opts = {} case ARGV.shift when 'alpha' opts = { :alpha => 100 } when 'angle' opts = { :angle => 0.314 } when 'scale' opts = { :scale_x => 2.0, :scale_y => 2.0 } end x, y = 50, 50 render = lambda { Game.screen.render_texture(texture, x, y, opts) } Game.fps = 1000 counter = 0 t = Time.now Game.run(256, 256) do Game.screen.clear 5000.times(&render) break if (counter+=1) >= 60 end p Time.now - t
実行環境
- OS: WidowsXP
- Ruby: ruby 1.8.6 (2008-03-03 patchlevel 114) [i386-mswin32]
- Ruby/SDL: Win32's binary(ver 1.3.1) for Ruby 1.8
- Star Ruby: starruby-0.1.17-win32.zip
- ビデオカード: 詳しくわからないけどゲーム用のPCじゃない
※手元のPC1台で確認しただけなので、以下の結果は一般的なものと大きく異なる可能性がある。
結果
Ruby/SDL
ruby sdl_bench.rb star.png #=> 0.578秒 ruby sdl_bench.rb star.png alpha #=> 2.547秒 ruby sdl_bench.rb star.png angle #=> 7.969秒 ruby sdl_bench.rb star.png scale #=> 11.422秒
Star Ruby
ruby star_bench.rb star.png #=> 1.938秒 ruby star_bench.rb star.png alpha #=> 2.062秒 ruby star_bench.rb star.png angle #=> 3.313秒 ruby star_bench.rb star.png scale #=> 8.172秒
star.pngはStar Rubyのサンプルデータ。16x16の画像データ。タイムは2回実行して小さい方を採用した。
基本描画はRuby/SDLの方が圧倒的に早い。半透明、回転、拡大処理を行うとStar Rubyの方がやや速度で上回る。 この結果を見る限り、Star Rubyは素の描画が遅い。 Ruby/SDLの1/3以下の速度しか出ていない。
使用する画像を200x150のサイズに変更すと次のような結果に。描画回数は500×60回で計測。
ruby sdl_bench.rb ruby.png #=> 3.484秒 ruby sdl_bench.rb ruby.png alpha #=> 39.562秒 ruby sdl_bench.rb ruby.png angle #=> 18.922秒 ruby sdl_bench.rb ruby.png scale #=> 40.296秒 ruby star_bench.rb ruby.png #=> 6.656秒 ruby star_bench.rb ruby.png alpha #=> 7.562秒 ruby star_bench.rb ruby.png angle #=> 23.765秒 ruby star_bench.rb ruby.png scale #=> 29.547秒
Star Rubyの速度改善に期待
通常の描画がRuby/SDLと同等以上で、各種変形操作を行ったときも速度比でみたときに、 今より速度低下が少ないと嬉しい。
まだまだ速くなるはず。