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

Нагрузка от EntityDeathEvent

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

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

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

    Баллы:
    173
    Skype:
    support.meedway
    Имя в Minecraft:
    Nick
    Имеется код
    Код:
      @EventHandler
        public void onMobDeath(EntityDeathEvent e){
            if (e.getEntity().getKiller() instanceof Player) {
                String entity = e.getEntity().getCustomName();
                Player p = e.getEntity().getKiller();
                if(entity == null)return;
               
                if(entity.startsWith("§c§lEazy")){
                    //запись в конфиг
                }
            }
        }
    Как его можно заменить, т.к. по показаниям timing от него идет нагрузка, так же на сервере иногда замечается пролагивание при данном событии.
     
  2. MurlikMurlik

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

    Баллы:
    96
    Этот ивент сам по себе по каким то не понятным причинам лагучий в таймингах. Даже если ты выведешь просто сообщение в чат при смерти, в таймингах будет светиться это событие.
     
  3. MurlikMurlik

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

    Баллы:
    96
    А, извиняйте, не дочитал.
    Не стоит сохранять что либо на диск в основном потоке.
     
  4. Автор темы
    SaMEC

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

    Баллы:
    173
    Skype:
    support.meedway
    Имя в Minecraft:
    Nick
    Код:
    new Thread(new Runnable() {
    
    @Override
    public void run() {
    //Тут то, что должно выполняться в отдельном потоке
    }
    
    }).start();
    
    Подойдет?
     
  5. MurlikMurlik

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

    Баллы:
    96
    Можно так, а лучше конечно баккитовским шедулером.
    Код:
                    Bukkit.getScheduler().runTaskAsynchronously(ссылка_на_главный_класс_плагина, () -> {
                        //что то
                    });
     
  6. MurlikMurlik

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

    Баллы:
    96
    А еще лучше сделать некий таймер с буфером. В буфер записывать то что нужно сохранить, а таймер в другом потоке все это сохранит через время и не надо будет 100 раз записывать на диск потому что 100 раз убили энтити.
     
    Последнее редактирование: 13 апр 2019
  7. Автор темы
    SaMEC

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

    Баллы:
    173
    Skype:
    support.meedway
    Имя в Minecraft:
    Nick
    В общем например кидать все в хешмеп, потом сохранять.
    Не исключены потери данных при критическом отключении, хотя это не смертельно
     

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