2006年03月01日
_ メモ
Ruby/SDL(or SDL)でalpha値を持ったサーフィス(PNGからロードした場合など) を描画するためには以下のようにする必要がある。
image = SDL::Surface.load("image.png") image.set_alpha(SDL::SRCALPHA|SDL::RLEACCEL, SDL::ALPHA_OPAQUE) image = image.display_format_alpha
あとは image を SDL.blit_surface を使って描画すれば良い。
2006年03月08日
_ ruby の -S オプションと rrb.el
rubyには -S というオプションがあることに最近気が付きました。 これは「指定したスクリプトをPATHの中から探索する」というものです。 おそらく Windows 用に作られたものだと思います。
で、これを使えば、exerbなどで rrb のコマンドをexe化しなくとも rrb.elがwindowsで使えるようにできます。 CVS HEADではこの改造を施してあります。 xyzzyのrrb.lでも このパッチを使うことで同様のことが できます(一応 rename local variable と extract method は簡単な 動作確認をしました)。
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
2006年03月25日
_ locale
Linux上でもja_JP.SJISのようなロケールを作っておくとたまに便利なことがあります。 具体的にいうと国際化についてあまり良く考えていないJavaアプリケーション (とくにJavaアプレットの類)の日本語の扱いがおかしい場合などです。
これが正しいやりかたかどうかは知りませんが。
2006年03月31日
_ fontlist
Windows もしくは Unix like OS 上でインストールされているフォントファイル へのファイルパスを得るためのツール。
<URL:http://d.hatena.ne.jp/mmatsuoka/20060312#1142135916> に書かれて いるような問題を解決できます。サイロスさんもこのような問題について 考えていたような気が。
このライブラリはあまり知られていないようなのでここに書いておきます。
_ deskull [参考になりました。]
_ サイロス誠 [なるほど。参考になります。]