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付近で安定していた。