FPS管理サンプル for Ruby/SDL
FPS(frame per second)を整える方法のRuby/SDLによるサンプル
require 'sdl' class Fpser private @next_time=0 @fpslist @fps @@WAIT_TIME=16.66666 public #-------------------------------------- # コンストラクタ #-------------------------------------- def initialize @old_time = SDL.getTicks() @fpslist = [0] @fpslist.clear end #-------------------------------------- # 更新 #-------------------------------------- def update time_out = true this_time = @old_time + (@@WAIT_TIME * @fpslist.length) next_time = this_time + @@WAIT_TIME next_time = (next_time+0.5).to_i #FPSを調整する。 while SDL.getTicks() < next_time sleep 0.0001 time_out = false end #FPSの計測 time = (SDL.getTicks()-this_time) if time != 0 then @fpslist << time end #FPSの取得 if @fpslist.length >= 60 @fps = 0 @fpslist.each{ |x| @fps += x } @fps /= @fpslist.length.to_f if @fps != 0 @fps = 1000.0/@fps end @fpslist.clear @old_time = SDL.getTicks() end return time_out end #-------------------------------------- # 取得 #-------------------------------------- def getFps return @fps end end if __FILE__ == $0 puts "-start-" fps = Fpser.new tcnt = 0 for t in 0..5 for i in 0..60 if fps.update then tcnt+=1 end end puts " FPS:#{sprintf("%.3f",fps.getFps)} TRUE:#{tcnt}" end puts "-end-" end
結果
FPS:60.00 TRUE:0 FPS:60.00 TRUE:0 FPS:60.00 TRUE:0 FPS:60.00 TRUE:0 FPS:60.00 TRUE:0 FPS:60.00 TRUE:0 | FPS:59.999 TRUE:0 FPS:59.939 TRUE:0 FPS:59.999 TRUE:0 FPS:59.999 TRUE:0 FPS:59.999 TRUE:0 FPS:59.999 TRUE:0 |
時々、0.1〜0.2変動することもあるけど、60.0付近で安定していた。