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

Пофиксить лаги

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

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

    Snowmaze Участник Пользователь

    Баллы:
    36
    Мой плагин очень прилично нагружает сервер и я хотел вывести в отдельный поток всё, чтобы не было в основном и получил ошибку Asynchronous entity add. Как можно решить проблему?
    Код:
    LivingEntity mob =  (LivingEntity) p.getWorld().spawnEntity(loc, randomMob);
     
  2. iD3LSY

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

    Баллы:
    76
    В спиготе работает один поток — главный. На геймпедии написано на этот счет.

    Работать с другими потоками можно:
     
  3. Автор темы
    Snowmaze

    Snowmaze Участник Пользователь

    Баллы:
    36
    А что если из-за моего плагина весь серв подлагивает?
     
  4. iD3LSY

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

    Баллы:
    76
    Вообще, это значит, что нерационально ты ресурсы используешь, кажется мне))
    (хотел еще в прошлом посте написать, но пытался прикрепить эту вонючую цитату, ведь теперь кнопки просто процитировать нет)
     
    Последнее редактирование: 23 июн 2019
  5. Автор темы
    Snowmaze

    Snowmaze Участник Пользователь

    Баллы:
    36
    проблемка в этом коде в том, что runTask() запускает задачу и главный поток дальше идёт по коду. Если я запихну весь тот код в runTask() то всё равно лагать будет. Мне нужно просто получить создать моба и получить его, а потом асинхронно уже с ним работать,а так как runTask() не задерживает главный поток оно дальше идёт по коду, пока этот таск объекта ещё не достал
     
  6. LuckyZeeRo

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

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    Сначала разберись в том, что эти лаги создает.
    Тайминги и spark в помощь.
    Работать асинхронно с Bukkit API крайне нежелательно.
     
  7. Автор темы
    Snowmaze

    Snowmaze Участник Пользователь

    Баллы:
    36
    Я смотрел, что создаёт лаги в таймингах и поэтому задал этот вопрос
     
  8. Автор темы
    Snowmaze

    Snowmaze Участник Пользователь

    Баллы:
    36
    Просто оно обходит циклом всех игроков и смотрит броню каждого игрока, а потом генит рандомные координаты относительно игрока и спавнит там моба в зависимости от брони игрока
     
  9. iD3LSY

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

    Баллы:
    76
    Ну все, рип ин пис. Вообще да, надо было уточнить, что у BukkitScheduler может выполнять асинхронно..)

    Читай этот пост с спигота от md_5.
     
  10. LuckyZeeRo

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

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    Скорее всего лаги к тому, что ты спавнишь энтити в рандомных координатах, там идет либо загрузка либо генерация чанков, что создает лаги. Сделай прегенерацию мира в нужной области, куда будешь спавнить энтити. WorldBorder в помощь.
     
  11. Автор темы
    Snowmaze

    Snowmaze Участник Пользователь

    Баллы:
    36
    Криво написал, но всё же
     
  12. iD3LSY

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

    Баллы:
    76
    В чем проблема? Как понял я: нужно создать экземпляр моба, асинхронно добавить в мир, также асинхронно продолжить работу.

    Почему нельзя создавать экземпляр тоже асинхронно — непонятно, но ок. У CraftWorld есть метод createEntity(Location, Class<? extends org.bukkit.entity.Entity>), остальное просто в runTaskAsynchronously.

    (Не уверен, что оно не прогрузит чанки)
     

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