2006年03月12日
_ Ruby/SDL + OpenGLの性能
ソフトウェアサーフェス使うよりハードによる高速化が効くOpenGL使ったほうが はやいんじゃないかという話をしたのですが、実際に試したわけではないので いろいろやってみることにしました。
調べたのは単純な「読みこんだ画像を表示」というものです。
で、結論はビデオカード/チップおよびドライバによる、というものでした。
Athlon64 3200+, GeForce6600GT, WindowsXP という環境ではOpenGLの方が2倍以上速い。
CeleronM 1.4G, Intel 855, Windows XP という環境では ソフトウェアサーフェス のほうが 1.5 倍ほど速い。
CeleronM 1.4G, Intel 855, Debian GNU/Linux, DRI on という環境では ソフトウェアサーフェスのほうが 5 倍以上速い。
こんな所です。適当な実験なのであまり結果は信用しないでください。
ちなみに実験に使ったスクリプトは以下の通りです。
# SWSURFACE用
require 'sdl'
SDL.init(SDL::INIT_VIDEO)
#screen = SDL.set_video_mode(640, 480, 16, SDL::HWSURFACE|SDL::FULLSCREEN)
#screen = SDL.set_video_mode(640, 480, 16, SDL::HWSURFACE|SDL::DOUBLEBUF|SDL::FULLSCREEN)
screen = SDL.set_video_mode(640, 480, 16, SDL::SWSURFACE|SDL::FULLSCREEN)
fill = SDL::Surface.load("images/640x480.png")
fill = fill.display_format
count = 0
start = SDL.get_ticks
loop do
while event = SDL::Event2.poll
case event
when SDL::Event2::Quit, SDL::Event2::KeyDown
puts "frame: #{count}"
d = SDL.get_ticks - start
puts "time: #{d}ms"
puts count.to_f / (d/1000.0)
exit
end
end
screen.fill_rect(0, 0, 640, 480, 0)
50.times{ SDL.blit_surface(fill, 0, 0, 640, 480, screen, 0, 0) }
#SDL.blit_surface(fill, 0, 0, 640, 480, screen, 0, 0)
screen.flip
count += 1
end
# OpenGL用
require 'sgt'
def quit
puts $count
d = SDL.get_ticks - $start
puts d
puts $count.to_f / (d/1000.0)
exit
end
SDL.init(SDL::INIT_VIDEO)
SDL.setGLAttr SDL::GL_RED_SIZE,8
SDL.setGLAttr SDL::GL_GREEN_SIZE,8
SDL.setGLAttr SDL::GL_BLUE_SIZE,8
SDL.setGLAttr SDL::GL_DEPTH_SIZE,16
SDL.setGLAttr SDL::GL_DOUBLEBUFFER,1
SGT.init(640, 480, 32, SDL::FULLSCREEN)
fill = SGT::Texture.load("images/640x480.png", false, 0)
SGT.disable_alpha_test
$count = 0
$start = SDL.get_ticks
loop do
while event = SDL::Event2.poll
case event
when SDL::Event2::Quit
quit
when SDL::Event2::KeyDown
quit if event.sym == SDL::Key::ESCAPE
end
end
SGT.clear(0, 0, 0)
50.times{ fill.draw(0, 0) }
SDL.GL_swap_buffers
$count += 1
quit if $count > 100
end
一番無難なのはハードウェアサーフェスのようですね。
Intel855は内部で3Dアクセラレータ持ってないので、そこがビハインドになっているようです。