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="https://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         }