mirror of
https://github.com/SlimeVR/SlimeVR-Server.git
synced 2026-04-06 02:01:58 +02:00
131 lines
2.7 KiB
Java
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;
|
|
}
|
|
}
|
|
}
|