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 }