Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
2006-04-05

Ruby/SDL の 2D 描画速度実験

Ruby/SDLMiyako のサイトを見ると速度が遅いとある。実際どんなものなのか実験してみた。

PCのスペックは次の通り。詳しくないがゲームの実行にはいまいちな環境だと思う。

SDL.blitSurface でのイメージ描画

256x256 のスクリーンに対して 16x16 のイメージを秒間 60 フレームで何個表示できるかという実験。結論から言うと手元のマシンでおよそ5000個。下記ののスクリプトの実行時間が、

  • 1.031 秒 …… スクリーンを 256x256 , イメージを 16x16

であった。

同じような処理を某ゲーム機(プレ○ステー○ョン)で行うと 1/60 秒で 2000 強スプライトが表示可能であったと記憶しているから、 Ruby/SDL のこの性能なら基礎的な 2D 描画能力は実用に十分な速度と言える。

スクリーンのサイズとイメージのサイズを変えると以下の通り。

  • 1.328 秒 …… スクリーンを 512x512 , イメージを 16x16
  • 1.532 秒 …… スクリーンを 256x256 , イメージを 32x32
  • 1.844 秒 …… スクリーンを 512x512 , イメージを 32x32
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( 'icon16.bmp' )
image.setColorKey( SDL::SRCCOLORKEY, image.getPixel(0,0) )
cx, cy = image.w / 2, image.h / 2
image = image.displayFormat

t = Time.now
60.times do
  while event = SDL::Event2.poll
    case event
    when SDL::Event2::Quit, SDL::Event2::KeyDown
      exit
    end
  end

  screen.fillRect( 0, 0, SCREEN_W, SCREEN_H, [ 0, 0, 128 ] )

  5000.times do
    image_x = rand(SCREEN_W)
    image_y = rand(SCREEN_H)
    SDL.blitSurface(image, 0, 0, 0, 0, screen, image_x, image_y)
  end

  screen.updateRect( 0, 0, 0, 0 ) 
end

p Time.now - t

※手元の環境では SDL::HWSURFACE に変えても速度差はでなかった。

SDL.transform_blit は 10 倍以上遅い

transform_blit を使ってイメージを回転させて表示。

5000.times do
  image_x = rand(SCREEN_W)
  image_y = rand(SCREEN_H)
  angle = rand(360)
  SDL.transform_blit(image, screen, angle, 1, 1, cx, cy, image_x, image_y, 0)
end

実行にかかった時間は 14.844 秒。

Ruby はどれくらい遅いのか

ループ部分から SDL の処理を取り除いて速度を計測。ループ部分を次のようにした。

60.times do
  5000.times do
    image_x = rand(SCREEN_W)
    image_y = rand(SCREEN_H)
  end
end

結果は 0.484 秒。これは驚くほど遅い。さらに次のようにすると、

60.times do
  5000.times do
    image_x = rand(SCREEN_W) - cx
    image_y = rand(SCREEN_H) - cy
  end
end

0.625 秒という結果に。 5000 個ぶんの座標計算とはいえこんなにかかるのか。ふうむ。

結論としては速度に注意を払いながら作らないと確かにすぐに非現実的な速度になってしまいそうだ。まあそれはコンシュマーゲーム機でも同じなんだけど。