Помогите Как получить тпс

  • Автор темы Автор темы Primer
  • Дата начала Дата начала

Primer

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
Primer_Legend
Как получить тпс? getTPS выдаёт мусор
unknown.png
 
double[] tps = Bukkit.getServer().spigot().getTPS()
 
Как получить тпс? getTPS выдаёт мусор
unknown.png
Это не он мусор выдаёт. Это ты Java не знаешь и документацию не смотришь. Привёл массив к строке - вот и результат.
Читай: https://papermc.io/javadocs/paper/1.13/org/bukkit/Bukkit.html#getTPS--

Это Paper, но на спиготе точно так же, скорее всего. Но, судя по докам, TPS на спиготе не получить вовсе:
https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/Server.Spigot.html
 
Чтобы получить время затраченное на выполнение последнего тика (в миллисекундах)
Работает до 1.12.2, выше не проверял
Код:
    @SuppressWarnings("deprecation")
    public double getTickTime() {
        return MathHelper.a(MinecraftServer.getServer().h) * 1.0E-6D;
    }

Чтобы получить ТПС
Код:
    public double getTPS() {
        double tps = 1000/getTickTime();
        return tps <= 20 ? tps : 20;
    }
Лагов нет если время тика не превышает 50мс

Обычное getTPS возвращает 3 значение - среднее ТПС за промежуток времени.
Код выше возвращает ТПС в тот момент когда вызываешь метод
 
Чтобы получить время затраченное на выполнение последнего тика (в миллисекундах)
Работает до 1.12.2, выше не проверял
Код:
    @SuppressWarnings("deprecation")
    public double getTickTime() {
        return MathHelper.a(MinecraftServer.getServer().h) * 1.0E-6D;
    }

Чтобы получить ТПС
Код:
    public double getTPS() {
        double tps = 1000/getTickTime();
        return tps <= 20 ? tps : 20;
    }
Лагов нет если время тика не превышает 50мс

Обычное getTPS возвращает 3 значение - среднее ТПС за промежуток времени.
Код выше возвращает ТПС в тот момент когда вызываешь метод
Нельзя определять TPS сервера по времени одного отдельного тика. Очень неточно.
Хотя бы секунд 5 нужно, а лучше как раз минуту
 
Нельзя определять TPS сервера по времени одного отдельного тика. Очень неточно.
Хотя бы секунд 5 нужно, а лучше как раз минуту
Всё зависит от целей. Это лишь один из вариантов.
 
Код свиснут из essentials.
Код:
package lag;

import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;

public class TPS extends JavaPlugin
{
    private static transient Timer timer;
    
    public void onEnable() {
        TPS.timer = new Timer();
        this.getServer().getScheduler().scheduleSyncRepeatingTask((Plugin)this, (Runnable)TPS.timer, 100L, 50L);
    }
    
    public static double getTPS() {
        return TPS.timer.get();
    }
}

Код:
package lag;

import java.util.Iterator;
import java.util.LinkedList;

public class Timer implements Runnable
{
    private transient long last;
    private final LinkedList<Double> history;
    
    Timer() {
        this.last = System.nanoTime();
        (this.history = new LinkedList<Double>()).add(20.0);
    }
    
    @Override
    public void run() {
        final long startTime = System.nanoTime();
        long timeSpent = (startTime - this.last) / 1000L;
        if (timeSpent == 0L) {
            timeSpent = 1L;
        }
        if (this.history.size() > 10) {
            this.history.remove();
        }
        final double tps = 5.0E7 / timeSpent;
        if (tps <= 21.0) {
            this.history.add(tps);
        }
        this.last = startTime;
    }
    
    public double get() {
        double avg = 0.0;
        for (final Double f : this.history) {
            if (f != null) {
                avg += f;
            }
        }
        return avg / this.history.size();
    }
}
 
Назад
Верх