トップ «前の日記(2006-11-20) 最新 次の日記(2006-11-22)» 編集

Route 477



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://マシン名/ みたいな

「.」をエスケープしてないのは仕様。