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

Помогите Обработка регионов

Тема в разделе "Разработка плагинов для новичков", создана пользователем Cristalix, 2 май 2018.

Метки:
  1. Автор темы
    Cristalix

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

    Баллы:
    76
    Имя в Minecraft:
    Test
    Код:
    for (Region rg : Anarchy.getRegions()) { //Все регионы на сервере
                            if (!rg.getMembers().contains(p.getName())) {
                                int sizeRegion = Anarchy.getInstance().range(rg.getLevel());//Расстояние от центра во все стороны
                                Cuboid cub = new Cuboid(e.getPlayer().getWorld(), rg.getX() + sizeRegion, rg.getY() + sizeRegion, rg.getZ() + sizeRegion, rg.getX() - sizeRegion, rg.getY() - sizeRegion, rg.getZ() - sizeRegion).contract();
                                if ((!rg.getOwner().equals(p.getName())) && (cub.contains(e.getBlock()))) {
                                    if (!rg.getMembers().contains(p.getName())) {
                                        e.setCancelled(true);
                                        p.sendMessage("Ты не можешь ломать здесь блоки");
                                        return;
                                    }
                                }
                            }
                        }
    Имеется вот такой говно код. Этот код обрабатывается когда игрок ломает/ставит блоки или же взаимодействует с ними. Проблема в том что при наличие больше 200-ух сотен регионов начинаются ужасные задержки.

    Причины таких задержек которые понял это:

    1.Как я понял все связано с тем что обрабатывается каждый регион на сервере.
    2.Используется вот такой кусочек кода (cub.contains(e.getBlock()).


    Метод getRegions() возвращает все регионы из памяти cache в которую они загружены при загрузке плагина.

    Прошу у вас помощи так как не знаю как убрать задержки(лаги).
     
  2. MrMagaChannel

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

    Баллы:
    76
    Имя в Minecraft:
    mrmagachannel
    Скинь метод contains из класса Cuboid.
     
  3. Автор темы
    Cristalix

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

    Баллы:
    76
    Имя в Minecraft:
    Test
    Цикл который проходит по всем блокам в кубе
     
  4. Автор темы
    Cristalix

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

    Баллы:
    76
    Имя в Minecraft:
    Test
    Код:
        public boolean contains(int x, int y, int z) {
            return x >= this.x1 && x <= this.x2 && y >= this.y1 && y <= this.y2 && z >= this.z1 && z <= this.z2;
        }
    
        public boolean contains(Block b) {
            return this.contains(b.getLocation());
        }
    
        public boolean contains(Location l) {
            if (!this.worldName.equals(l.getWorld().getName())) {
                return false;
            }
            return this.contains(l.getBlockX(), l.getBlockY(), l.getBlockZ());
        }
     
  5. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Это не цикл, если что
     
  6. Zнамя Юности

    Zнамя Юности Активный участник Пользователь

    Баллы:
    76
    вот это как высчитывается?
     
  7. Автор темы
    Cristalix

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

    Баллы:
    76
    Имя в Minecraft:
    Test
    Ошибся
     
  8. Автор темы
    Cristalix

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

    Баллы:
    76
    Имя в Minecraft:
    Test
    Switch(rg.getLevel()) {
    case 1:
    return 3;
    }

    И так до 7
     
  9. MrMagaChannel

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

    Баллы:
    76
    Имя в Minecraft:
    mrmagachannel
    У тебя тут кстати лишняя проверка.
    upload_2018-5-2_18-57-24.png

    P. S. Не помешали бы тайминги во время нагрузки.
     
  10. Автор темы
    Cristalix

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

    Баллы:
    76
    Имя в Minecraft:
    Test
    Стыдно конечно, но как тайминги это замерить? (Имею ввиду код)
     
  11. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    В коде - замерять количество мили(или нано)секунд которые ушли на выполнение блока кода.

    На сервере - /timings on, делать что-то что хочешь проверить и /timings paste
     
  12. alexandrage

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

    Баллы:
    173
    Не учили в кеширование? Записываем локакцию с именем региона по которой кликали куда то в мапу. Повторные клики перестанут грузить. При удаление каких то регионов очишать кеш.
     
  13. Zнамя Юности

    Zнамя Юности Активный участник Пользователь

    Баллы:
    76
    а вообще скорее всего из-за того, что каждый раз новый кубоид создается. ты бы его лучше в класс региона засунул.
     
  14. alexandrage

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

    Баллы:
    173
    Тут еще и утечка памяти летит. Да.
     
  15. Автор темы
    Cristalix

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

    Баллы:
    76
    Имя в Minecraft:
    Test
    О начала до конца цикла for занимает большой промежуток времени.
     
  16. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    [​IMG]
    Тебе надо оптимизировать проверку, выше уже дали совет.
     
  17. MrMagaChannel

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

    Баллы:
    76
    Имя в Minecraft:
    mrmagachannel
    Проверь каждую строку кода с действием на время выполнения.
     

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