Files
SlimeVR-Server/java/io/eiren/util/BufferedTimer.java
2022-09-13 03:13:06 +03:00

131 lines
2.7 KiB
Java

package io.eiren.util;
import java.beans.ConstructorProperties;
import com.jme3.system.NanoTimer;
/**
* This timer accumulate measured TPF and returns average/min/max FPS value
*/
public class BufferedTimer extends NanoTimer {
private final float measureInterval;
private float averageTpf;
private float averageFps;
private float averageFrameRenderTime;
private float sumFrameRenderTime;
private float sumTpf;
private float minFpsCurrent;
private float maxFpsCurrent;
private float maxFps;
private float minFps;
private int count;
private boolean measured = false;
/**
* Measure average tpf over the provided inverval in seconds
*
* @param measureInterval interval to measure averages over
*/
public BufferedTimer(float measureInterval) {
averageFps = 0;
sumTpf = 0;
count = 0;
this.measureInterval = measureInterval;
}
public float getAverageFPS() {
return averageFps;
}
public float getMinFPS() {
return minFps;
}
public float getMaxFPS() {
return maxFps;
}
public void addRenderTime(float renderTime) {
sumFrameRenderTime += renderTime;
}
public float getAverageFrameRenderTime() {
return averageFrameRenderTime;
}
public boolean isMeasured() {
if (measured) {
measured = false;
return true;
}
return false;
}
public TimerSample getCurrentData() {
return new TimerSample(getFrameRate(), minFps, maxFps, averageFps);
}
@Override
public void update() {
super.update();
// Accumulate instant rate
sumTpf += getTimePerFrame();
float fps = getFrameRate();
if (fps < minFpsCurrent)
minFpsCurrent = fps;
if (fps > maxFpsCurrent)
maxFpsCurrent = fps;
++count;
// Calculate results once per measure interval
if (!measured || sumTpf > measureInterval) {
// Average results
averageTpf = sumTpf / count;
averageFps = 1.0f / averageTpf;
averageFrameRenderTime = sumFrameRenderTime / count;
minFps = minFpsCurrent;
maxFps = maxFpsCurrent;
// Reset counter
sumTpf = 0;
sumFrameRenderTime = 0;
minFpsCurrent = Float.MAX_VALUE;
maxFpsCurrent = 0;
count = 0;
measured = true;
}
}
public static class TimerSample {
public float fps;
public float minFps;
public float maxFps;
public float averageFps;
@ConstructorProperties({ "fps", "minFps", "maxFps", "averageFps" })
public TimerSample(float fps, float minFps, float maxFps, float averageFps) {
this.fps = fps;
this.minFps = minFps;
this.maxFps = maxFps;
this.averageFps = averageFps;
}
public float getFps() {
return fps;
}
public float getMinFps() {
return minFps;
}
public float getMaxFps() {
return maxFps;
}
public float getAverageFps() {
return averageFps;
}
}
}