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と同等以上で、各種変形操作を行ったときも速度比でみたときに、 今より速度低下が少ないと嬉しい。
まだまだ速くなるはず。
はじめてのRubyプログラミング
http://www.amazon.co.jp/o/ASIN/4798019437/dgames0a-22
おかげさまで2冊目の書籍を出すことができました。
今回も何人もの方々にご協力いただきました。どうもありがとうございました。
--
去年の春から2年間も締め切りに追われていた。やっと解放された。もう書きたくない。これのせいでずっと開発も止まってたし。
[栽培日誌]野菜の話
http://d.hatena.ne.jp/yappo/20080330/1206809229
yappoさんの野菜の話。
かたくなに農薬も化学肥料も使わずにせっせと野菜を作り続けているオレからすると、 ちょっと言いすぎかなという感じはするけど、でもまあ自分もそれを目指してる。
オレ自身、自然農法を目指して、試行錯誤してるけど、いろいろ難しい。 うまくいくところと、いかないところがある。とりあえず大根は耕さなくても育つ。それは本当。
種の保守、シードセイバーに関するいい本があるんだけどタイトル忘れた。
yappoさん、ニンニクの育ちはどうですか? うちのは去年は小さいのしか収穫できなかったんだけど、今年のやつは油粕と一緒に埋めたせいか茎がものすごく太く(1.5〜2cmくらい)なってますよ。