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://マシン名/ みたいな
「.」をエスケープしてないのは仕様。