1  /**
     2   * com.sekati.time.FPS
     3   * @version 1.1.1
     4   * @author jason m horwitz | sekati.com
     5   * Copyright (C) 2007  jason m horwitz, Sekat LLC. All Rights Reserved.
     6   * Released under the MIT License: http://www.opensource.org/licenses/mit-license.php
     7   */
     8   
     9  import com.sekati.core.CoreObject;
    10  import com.sekati.events.FramePulse;
    11  
    12  /**
    13   * Monitor the current applications framerate (fps).
    14   * {@code Usage:
    15   * 	var f:FPS = new FPS(Delegate.create(this,fpsUpdate), 1);
    16   * 	function fpsUpdate(current:Number, average:Number, currentTrend:String, averageTrend:String):Void {
    17   * 		tf.text = "current fps: "+currentTrend+current+" average fps: "+averageTrend+average;
    18   * 	}
    19   * }
    20   */
    21  class com.sekati.time.FPS extends CoreObject {
    22  
    23  	private var _this:FPS;
    24  	private var _frame:Number;
    25  	private var _currentFps:Number;
    26  	private var _currentTrend:String;
    27  	private var _averageFps:Number;
    28  	private var _averageTrend:String;
    29  	private var _now:Number;
    30  	private var _updateEachFrame:Number;
    31  	private var _cb:Function;
    32  
    33  	/**
    34  	 * FPS Constructor
    35  	 * @param cb (Function) callback to pass (currentFps:Number, averageFps:Number, currentTrend:String, averageTrend:String)
    36  	 * @param updateEachFrame (Number) frame ticks between cb updates
    37  	 */
    38  	public function FPS(cb:Function, updateEachFrame:Number) {
    39  		super( );
    40  		_this = this;
    41  		_frame = 1;
    42  		_cb = cb;
    43  		_updateEachFrame = (updateEachFrame != null) ? updateEachFrame : 1;
    44  		_now = getTimer( );
    45  		FramePulse.getInstance( ).addFrameListener( _this );		
    46  	}
    47  
    48  	/**
    49  	 * handle onEnterFrame Pulse
    50  	 */
    51  	 
    52  	private function _onEnterFrame():Void {
    53  		var cur:Number = Math.round( 1000 / (getTimer( ) - _now) );
    54  		_currentTrend = (cur >= _currentFps) ? "+" : "-";
    55  		_currentFps = cur;
    56  		_now = getTimer( );
    57  		var avg:Number = Math.round( (_frame / (_now / 1000)) );
    58  		_averageTrend = (avg >= _averageFps) ? "+" : "-";	
    59  		_averageFps = avg;
    60  		// cb on each X frame
    61  		if(_frame % _updateEachFrame == 0) {
    62  			_cb( _currentFps, _averageFps, _currentTrend, _averageTrend );
    63  		}
    64  		_frame++;
    65  	}
    66  
    67  	/**
    68  	 * Destroy the FPS Singleton instance.
    69  	 * @return Void
    70  	 */
    71  	public function destroy():Void {
    72  		FramePulse.$.removeFrameListener( _this );
    73  		delete _this;
    74  		super.destroy( );
    75  	}	
    76  }