Какие есть методы оптимизации триггеров при переборе юнитов? Может есть смысл работать с ними чертез вейты? Например сначала их перебрать, потом подождать 0.01 секунду, потом сделать с ними ряд действий, потом ещё действия. И так далее, постепенно. Имеется ли в этом смысл?

WilliamBz, событие" юнит входит в область другого юнита" чем не нравится? Делаешь 3 тригора:
  1. регистрация события - герой прокачивает способность -> добавить событие в тригор 2 на вход юнита в область(радиус)
  2. Юнит входит в радиус от юнита -> добавить юниту триггера неуязвимость или чо там у тебя и добавляешь в группу юнитов
  3. Каждые 0.05 сек перебираем юнитов в группе и сравниваем расстояние до героя и если надо удаляем неуяз.
Так то лучше для каждого героя завести отдельный таймер и группу юнитов, но я так навскидку написал
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
26
Лучше опиши подробнее задачу.
Но в плане оптимизации есть смысл выбирать группу юнитов под конкретные условия, которые выделяют небольшую нужную тебе группу + чем реже выбираешь тем более оптимизированно.
То есть выбирать каждые 0.5 сек это оптимизированней, чем каждые 0.01.
15
konvan5, мне нужно сделать силовое поле, которое может быть у героя каждого из 24 игроков. Тот кто стоит в поле, тот получает неуязвимость к дальнобойным атакам (способность). Кто выходит - теряет способность. Карта melee, так что в поле может быть много войск.
Проблема в том, что через перебор надо найти этих юнитов, сравнить их с предыдущими, и дать/удалить им способность. И если это сделают 24 игрока одновременно, то будет фризить по жёсткой. Но даже если это делает один игрок, есть фриз все равно.
Даже если по очереди перебирать игроков каждые 0,04 секунды, все равно зафризит.
13
Принятый ответ
WilliamBz, событие" юнит входит в область другого юнита" чем не нравится? Делаешь 3 тригора:
  1. регистрация события - герой прокачивает способность -> добавить событие в тригор 2 на вход юнита в область(радиус)
  2. Юнит входит в радиус от юнита -> добавить юниту триггера неуязвимость или чо там у тебя и добавляешь в группу юнитов
  3. Каждые 0.05 сек перебираем юнитов в группе и сравниваем расстояние до героя и если надо удаляем неуяз.
Так то лучше для каждого героя завести отдельный таймер и группу юнитов, но я так навскидку написал
Загруженные файлы
15
IzobretatelBoom, прикольная вещь. Но получается, что если у меня 24 игрока, то мне придётся каждые 0,01 секунды выбирать рандом юнита со способкой и проверять его расстояние для каждого героя со включенной способностью?
26
IzobretatelBoom, если я правильно помню, регистрация такого события регистрирует вход в точку, где стоял юнит, а не вход в зону юнита при его движении. Надо потестить.
WilliamBz, зачем 100 раз проверять в секунду для бафа? Даже если будет задержка при выходе в 0.25 секунды, человек этого не заметит а юнит далеко от границы даже не убежит.
Так что смело делай проверки каждые 0.2 секунды, а то и 0.4-0.5 и будет окей.
Даже для стандартных аур проверка идет вроде каждые 1 или 2 сек, не помню точно.
15
konvan5, надо как-то сделать чтобы каждый юнит проверялся раз в пару секунд. Но при этом проверялся один юнит за раз, в целях оптимизации.
15
konvan5, спасибо большое за этот совет. 0.2 секунды действительно в самый раз.
Если меньше то фризит.
15
IzobretatelBoom, я сделал триггер так как ты сказал. Когда кто-то входит в сферу героя во время применения способности, то происходят действия:
Наблюдаются лютые усугубляющиеся очень быстро фризы, если сразу 2 героя применяют способность.
Проверка за выходы за пределы сферы проверяется таким образом:
Не думаю что дело в ней. Мне кажется именно вхождение в сферу вызывает фризы.
Кстати, во время онлайн сессии с другом, при одном только запуске способности происходит бесконечный фриз.
Загруженные файлы
26
WilliamBz, а где перебор юнитов в bubble_units на втором скрине?
Ты выбрал ОДИН раз случайного юнита и все... Я так и не понял, что ты там проверяешь всего с одним случайным юнитом... А что, остальных не надо?
Ты не показал триггер, где юнит запускает абилку.
15
konvan5, я не делаю перебор с целью оптимизации. Если перебирать всех юнитов и высчитывать им расстояние ко всем кастерам (коих может быть до 24), то игра просто утонет во фризах. Поэтому я перебираю по одному юниту рандомному, и высчитываю его расстояние к кастерам, чтобы проверить, находится ли он в данный момент под чьим-то куполом, или нет.
Вот событие:
Вот штука, которая записывает кастеров в событие триггера:
Она срабатывает каждый раз как кто-то кастует способку.
Эта штука которая срабатывает если юнит заходит в купол:
Эта штука проверяет, рандомный юнит вышел из купола или нет:
С периодичностью ещё поиграюсь.
Эта штука проверяет, способен ли герой продолжать держать купол, или нет:
Эта штука реагирует если герой отменил способность:
13
WilliamBz, Вроде все правильно сделал, но конечно выбирать случайного юнита в группе,а не всю группу перебирать эт мем, оно у тебя не будет работать нормально.
Да и такую систему на гуях писать я бы не стал
15
IzobretatelBoom, мне кажется проблема в добавлении спеллбука юниту. Раньше были точно такие же фризы, когда я делал систему, которая каждую секунду удаляла у всех юнитов спеллбук, и давала его только тем кто под куполом.
В спелл буке такие способности:
Я бы предположил что это бот пытается пользоваться скиллами. Но скиллы пассивные. Даже не знаю из-за чего могут быть фризы.
но конечно выбирать случайного юнита в группе,а не всю группу перебирать эт мем, оно у тебя не будет работать нормально.
Должно робить. Все кто под куполом записываются в общую группу. И даже если все купола будут отключены, все юниты со временем переберутся и у них спеллбук удалится. Да, это будет с небольшой задержкой. Но полагаю по одному лучше для оптимизации, чем всех сразу перебирать. Просто уже есть опыт перебора большого числа юнитов. Фризит и всё. И даже 64 разряда на 1.31 не спасают.
Карта рассчитана на 24 игрока, на игру с ботами. Поэтому стараюсь делать максимально оптимизированно.
P.S.
А на счёт гуев. Я не знаю синтаксис джасса. И как мне кажется - варкрафт - это не тот случай, ради которого стоит изучать язык программирования. Всё же в эти карты особо никто не играет. Это делается больше для своего фана.
В гуях конечно менее удобно. Но по крайней мере не нужно помнить как какая функция называется, где большая а где маленькая буква ставится, и где какую функцию использовать. Если бы был условный конструктор джасса, чтобы выбиратьиз готовых функций с норм названиями и описаниями, и заполненными шаблонами внутри, то было бы наверно здорово.
Загруженные файлы
13
WilliamBz, изучать жасс, кек. Я просто взял и начал на нем делать, там нечего изучать если на гуях умеешь
27
мне нужно сделать силовое поле, которое может быть у героя каждого из 24 игроков. Тот кто стоит в поле, тот получает неуязвимость к дальнобойным атакам (способность). Кто выходит - теряет способность. Карта melee, так что в поле может быть много войск.
Проблема в том, что через перебор надо найти этих юнитов, сравнить их с предыдущими, и дать/удалить им способность. И если это сделают 24 игрока одновременно, то будет фризить по жёсткой. Но даже если это делает один игрок, есть фриз все равно.
Даже если по очереди перебирать игроков каждые 0,04 секунды, все равно зафризит.
По-моему, проблема надуманная.
Не, просадки по производительности в мили на 24 игрока будут практически гарантировано, ещё до какого-либо кастом кода, просто потому что движок будет задыхаться. Реф в этом плане покрепче, но всё с теми же болячками.
Но если бы перебор 24 больших групп пару раз в секунду (в самом худшем сценарии) вызывал бы видимый фриз, то в варкрафте вообще было бы невозможно пилить, например, кастомные снаряды.
Мне кажется, что оптимизировать тут особо нечего, и для фризов тут какая-то уж совсем колхозная реализация должна быть.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.