1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Primer, 5 сен 2021.

  1. Автор темы
    Primer

    Primer Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Primer_Legend
    Как получить тпс? getTPS выдаёт мусор
    [​IMG]
     
  2. Demrenus

    Demrenus Активный участник Пользователь

    Баллы:
    66
    double[] tps = Bukkit.getServer().spigot().getTPS()
     
  3. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Это не он мусор выдаёт. Это ты 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
     
  4. NoooobKa

    NoooobKa Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    Чтобы получить время затраченное на выполнение последнего тика (в миллисекундах)
    Работает до 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 значение - среднее ТПС за промежуток времени.
    Код выше возвращает ТПС в тот момент когда вызываешь метод
     
  5. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Нельзя определять TPS сервера по времени одного отдельного тика. Очень неточно.
    Хотя бы секунд 5 нужно, а лучше как раз минуту
     
  6. NoooobKa

    NoooobKa Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    Всё зависит от целей. Это лишь один из вариантов.
     
  7. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Код свиснут из 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();
        }
    }
    
     

Поделиться этой страницей