content: package com.almalence.util;
  
  public class FpsMeasurer
  {
  	private final int		width;
  
  	private volatile long	lastTime	= System.currentTimeMillis();
  	private volatile float	fps			= 0.0f;
  	private volatile long	interval	= 0;
  
  	/**
  	 * Creates <code>FpsMeasurer</code> instance without window (width=1).
  	 */
  	public FpsMeasurer()
  	{
  		this.width = 1;
  	}
  
  	/**
  	 * Creates <code>FpsMeasurer</code> instance with specified measurement
  	 * window width.
  	 * 
  	 * @param window_width
  	 *            Measurement window width
  	 */
  	public FpsMeasurer(final int window_width)
  	{
  		this.width = window_width;
  	}
  
  	/**
  	 * Measures time since last call and calculates FPS based on the time
  	 * interval and window width.
  	 * 
  	 * @return current FPS;
  	 */
  	public float measure()
  	{
  		final long time = System.currentTimeMillis();
  		this.interval = time - this.lastTime;
  		this.fps += ((1000.0f / Math.max(this.interval, 1)) - this.fps) / this.width;
  		this.lastTime = time;
  
  		return this.fps;
  	}
  
  	/**
  	 * @param interval
  	 * @return
  	 */
  	public float addMeasurement(final long interval)
  	{
  		if (interval > 0)
  		{
  			final long time = System.currentTimeMillis();
  			this.interval = interval;
  			this.fps += ((1000.0f / this.interval) - this.fps) / this.width;
  			this.lastTime = time;
  		}
  
  		return this.fps;
  	}
  
  	/**
  	 * Returns currently measured FPS.
  	 * 
  	 * @return current FPS
  	 */
  	public float getFPS()
  	{
  		return this.fps;
  	}
  
  	/**
  	 * Returns last measurements interval.
  	 * 
  	 * @return last measurements interval
  	 */
  	public long getLastInterval()
  	{
  		return this.interval;
  	}
  
  	/**
  	 * Clears all the collected data.
  	 */
  	public void flush()
  	{
  		this.lastTime = System.currentTimeMillis();
  		this.fps = 0.0f;
  		this.interval = 0;
  	}
  }
  