001 package com.croftsoft.core.animation.updater;
002
003 import javax.swing.JComponent;
004
005 import com.croftsoft.core.animation.ComponentUpdater;
006 import com.croftsoft.core.math.MathConstants;
007
008 /*********************************************************************
009 * Samples and prints the frame rate.
010 *
011 * @version
012 * $Date: 2008/04/19 21:27:14 $
013 * @since
014 * 2003-02-12
015 * @author
016 * <a href="http://www.CroftSoft.com/">David Wallace Croft</a>
017 *********************************************************************/
018
019 public final class FrameRateUpdater
020 implements ComponentUpdater
021 //////////////////////////////////////////////////////////////////////
022 //////////////////////////////////////////////////////////////////////
023 {
024
025 private static final double MILLISECONDS_PER_SECOND = 1000.0;
026
027 private static final long SAMPLE_PERIOD_IN_MILLIS = 10000;
028
029 //
030
031 private final boolean printFrameRate;
032
033 //
034
035 private long frameCount;
036
037 private double frameRate;
038
039 private long lastUpdateTime;
040
041 //////////////////////////////////////////////////////////////////////
042 //////////////////////////////////////////////////////////////////////
043
044 public FrameRateUpdater ( boolean printFrameRate )
045 //////////////////////////////////////////////////////////////////////
046 {
047 this.printFrameRate = printFrameRate;
048 }
049
050 public FrameRateUpdater ( )
051 //////////////////////////////////////////////////////////////////////
052 {
053 this ( false );
054 }
055
056 //////////////////////////////////////////////////////////////////////
057 //////////////////////////////////////////////////////////////////////
058
059 public void update ( JComponent component )
060 //////////////////////////////////////////////////////////////////////
061 {
062 long updateTime
063 = System.nanoTime ( ) / MathConstants.NANOSECONDS_PER_MILLISECOND;
064
065 frameCount++;
066
067 long timeDelta = updateTime - lastUpdateTime;
068
069 if ( timeDelta < SAMPLE_PERIOD_IN_MILLIS )
070 {
071 return;
072 }
073
074 if ( timeDelta > 1.5 * SAMPLE_PERIOD_IN_MILLIS )
075 {
076 lastUpdateTime = updateTime;
077
078 frameCount = 0;
079
080 return;
081 }
082
083 frameRate = frameCount * MILLISECONDS_PER_SECOND / timeDelta;
084
085 frameCount = 0;
086
087 lastUpdateTime = updateTime;
088
089 if ( printFrameRate )
090 {
091 System.out.println ( "Frames per second: " + frameRate );
092 }
093 }
094
095 //////////////////////////////////////////////////////////////////////
096 //////////////////////////////////////////////////////////////////////
097
098 public double getFrameRate ( )
099 //////////////////////////////////////////////////////////////////////
100 {
101 return frameRate;
102 }
103
104 //////////////////////////////////////////////////////////////////////
105 //////////////////////////////////////////////////////////////////////
106 }