2006-11-21
■ [Ruby/SDL] Test::UnitでFPSTimerのバグを調査してみた
1秒間のフレーム数を一定にするために Ruby/SDLのチュートリアルにあるfpstimer.rbを使っていたのだが、 なんか描画が重いときに実FPS(描画FPSじゃなく)が60切ってる気がしたので、Test::Unitを使って調べてみた。
require 'test/unit'
require 'fpstimer.rb'
class TestDebugMessage < Test::Unit::TestCase
#描画が十分軽いときに、実FPS = 描画FPS = 60 となることを確認
def test_fpstimer
@timer = FPSTimer.new(60)
fr, dfr = do_task_1sec()
assert_equal 60, dfr
assert_equal 60, fr
end
#描画が重いときも、実FPSは60くらいになることを確認
def test_fpstimer_heavy
@timer = FPSTimer.new(60)
fr, dfr = do_task_1sec(proc{sleep 0.02})
skipped = @timer.total_skip
puts "drawed #{dfr} frames of #{fr} (#{skipped} skipped)"
assert_equal fr, dfr+skipped
assert_in_delta 60, fr, 2 #58〜62
end
#1秒間の実フレーム数と描画フレーム数を計測する
def do_task_1sec(draw = proc{})
@timer.reset
frames = 0
drawed_frames = 0
start = Time.now
while (Time.now - start < 1)
frames += 1
@timer.wait_frame do
draw.call
drawed_frames += 1
end
end
[frames, drawed_frames]
end
end
実行してみると「60 wanted but was 47」となったので、やっぱり実FPSが落ちているらしい。sleep 0.7とかで試してみて、 どうも「1回描画をスキップしただけでは足らない」というケースにバグがあるらしいことが分かった。
とIRCで報告したところで、大林さんが何か気付いた模様。現在チュートリアル|[[Ruby/SDLのチュートリアルに 上がっているバージョンでは上のバグは直っています。
何が言いたいかって?えーと……、ゲーム開発でもテストが役立つことはあるよってことで。
■ [memo] プライベートなリファラ
メモ。
ブクマ
%r<\Ahttp://b.hatena.ne.jp/add\?>, %r<\Ahttp://b.hatena.ne.jp/[^/]+/add\?>, %r<\Ahttp://bookmark.fc2.com/user/post\?>, %r<\Ahttp://clip.livedoor.com/clip/add\?> %r<\Ahttp://del.icio.us/[^\?]+\?(.*)url=>,
RSSリーダ
%r<(freshreader|fr)(.*)feedshow(cat|all)?.php\?>, %r<\Ahttp://feedbringer.net/feed>, %r<\Ahttp://feedpath.jp/feedreader/>, %r<\Ahttp://reader.livedoor.com/subscribe/>, %r<\Ahttp://www.bloglines.com/myblogs_display\?>, %r<\Ahttp://www.google.com/reader/view/>,
プライベートアドレス
%r<\Ahttp://localhost>, %r<\Ahttp://[^\./]+/>, # http://マシン名/ みたいな
「.」をエスケープしてないのは仕様。
[ツッコミを入れる]