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

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 в которую они загружены при загрузке плагина.

Прошу у вас помощи так как не знаю как убрать задержки(лаги).
 
Скинь метод contains из класса Cuboid.
Код:
    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());
    }
 
У тебя тут кстати лишняя проверка.
upload_2018-5-2_18-57-24.png

P. S. Не помешали бы тайминги во время нагрузки.
 
Стыдно конечно, но как тайминги это замерить? (Имею ввиду код)
В коде - замерять количество мили(или нано)секунд которые ушли на выполнение блока кода.

На сервере - /timings on, делать что-то что хочешь проверить и /timings paste
 
Не учили в кеширование? Записываем локакцию с именем региона по которой кликали куда то в мапу. Повторные клики перестанут грузить. При удаление каких то регионов очишать кеш.
 
а вообще скорее всего из-за того, что каждый раз новый кубоид создается. ты бы его лучше в класс региона засунул.
 
О начала до конца цикла for занимает большой промежуток времени.
 
О начала до конца цикла for занимает большой промежуток времени.
wUVESHkR6DI.jpg

Тебе надо оптимизировать проверку, выше уже дали совет.
 
Назад
Верх