Plex-FAWE/worldedit-core/src/main/java/com/boydti/fawe/util/FaweTimer.java
2020-02-16 15:14:34 -05:00

92 lines
2.3 KiB
Java

package com.boydti.fawe.util;
import java.util.Arrays;
public class FaweTimer implements Runnable {
private final double[] history = new double[]{20d, 20d, 20d, 20d, 20d, 20d, 20d, 20d, 20d, 20d, 20d, 20d, 20d, 20d, 20d, 20d, 20d, 20d, 20d, 20d};
private int historyIndex;
private long lastPoll = System.currentTimeMillis();
private long tickStart = System.currentTimeMillis();
private final long tickInterval = 5;
private long tick;
private long tickMod;
@Override
public void run() {
tickStart = System.currentTimeMillis();
tick++;
if (++tickMod == tickInterval) {
tickMod = 0;
} else {
return;
}
long timeSpent = tickStart - lastPoll;
if (timeSpent == 0) {
timeSpent = 1;
}
double millisPer20Interval = tickInterval * 50 * 20;
double tps = millisPer20Interval / timeSpent;
history[historyIndex++] = tps;
if (historyIndex >= history.length) {
historyIndex = 0;
}
lastPoll = tickStart;
}
private long lastGetTPSTick;
private double lastGetTPSValue = 20d;
public double getTPS() {
if (tick < lastGetTPSTick + tickInterval) {
return lastGetTPSValue;
}
double total = Arrays.stream(history).sum();
lastGetTPSValue = total / history.length;
lastGetTPSTick = tick;
return lastGetTPSValue;
}
public long getTick() {
return tick;
}
public long getTickMillis() {
return System.currentTimeMillis() - tickStart;
}
public long getTickStart() {
return tickStart;
}
private long skip = 0;
private long skipTick = 0;
public boolean isAbove(double tps) {
if (tps <= 0) {
return true;
}
if (skip > 0) {
if (skipTick != tick) {
skip--;
skipTick = tick;
return true; // Run once per tick
}
return false;
}
if (getTickMillis() > 100 || getTPS() < tps) {
skip = 10;
skipTick = tick;
}
return true;
}
private boolean runIfAbove(Runnable run, double tps) {
if (isAbove(tps)) {
run.run();
return true;
}
return false;
}
}