mirror of
https://github.com/plexusorg/Plex-FAWE.git
synced 2024-07-03 15:40:02 +00:00
92 lines
2.3 KiB
Java
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;
|
|
}
|
|
}
|