В предыдущем моём вопросе мне предложили подобный тип безутечного перебора большой группы.
GUI
В целом, вроде утечек то и нет, но из-за перебора 500+ юнитов и игнорируя что часть из них мертвы вызывает заметные микрофризы. (Особенно у людей со слабым пк)
Собственно есть идеи как можно оптимизировать это?
PS: Внутри пика множество проверок ifthenelse
GUI

Принятый ответ

Изначально было как обычно, через множество групп с нужной выборкой и их очистку. Но было падение фпса, спустя определенное время игры. С помощью счетчика хендлов выяснили что "Pick every unit in" вызывает утечки. Был предложен такой вот метод выбора всех юнитов через локалку и с помощью ifthenelse отсеивать нужных. В принципе помогло с фпсом. Он стабильный. Но вот видимо все эти переборы вызывают микрофризы.
А утечки точно из-за самого выбора? Насколько знаю, нативные функции утечек не вызывают, а BJ реализация ForGroup вроде без утечек...
Мб дело в обработке группы было?
И на счёт групп - пробовали выделить заранее штук сто-двести глобальных групп и использовать по необходимости? Без создания новых.
Кстати, GetUnitsInRangeOfLocMatching() вроде вызывает утечку. Это получение группы юнитов, находящихся внутри окружности с радиусом и подходящих по условию. Утечка в том, что возвращается локальная переменная. Лечится как раз использованием глобальной переменной. (Глобальной переменной присваивается значение локальной, локальная обнуляется, глобальная возвращается)
Venommm:
Если такой способ действительно эффективней, можно пожалуйста самый элементарный пример, хотябы в виде скрина.
Вам ну гуи, да? По моему, на гуи так не получится. Насколько помню, GroupEnumUnitsInRange() и ForGroup() нет в действиях, а аналоги утечны. Но я могу и ошибаться, сужу по коду в Blizzard.j, а не по тестам.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
19
3 года назад
0
Похожие вопросы:

ответ
Спасибо всем за ответы и пояснения! Закрываю флудильню :с

0
28
3 года назад
0
А что в этих условиях?
0
18
3 года назад
0
PT153:
А что в этих условиях?
Проверка на тип юнита и наличие бафа или других подобных маркеров
0
9
3 года назад
0
Venommm:
PT153:
А что в этих условиях?
Проверка на тип юнита и наличие бафа или других подобных маркеров
Можно пример?
Ибо не очень ясно почему нельзя сразу проводить действия с нужными юнитами.
0
27
3 года назад
Отредактирован rsfghd
0
А с таким кол-вом условий поток не обрывается?

Да и чёт я не понимаю вариант первого "безутечного" перебора группы. По факту ты глобальной переменной присвоил значение локальной, которая создание группы, затем ты уничтожаешь группу 2 раза через разные переменные, зачем? К тому же создавать и уничтожать группу не нужно, достаточно написать перед пиком группы set bj_wantDestroyGroup = true, и всё
2
7
3 года назад
2
Я так понимаю, что перебираются все юниты на карте, затем для каждого перебирается куча условий, есть аура или нет ?. Делать надо не так, я реализую по другому - Когда выдаю юнита, создаю таймер к юниту, затем выбираю юнитов в области через GroupEnumUnitsInRange, заношу нужных юнитов в локальную группу, которая сейвится через хештаблицу к герою (кто излучает ауру). В GroupEnumUnitsInRange выдаю бафы аур, в forgroup - убираю бафы, кто не подходят под условия.
0
9
3 года назад
0
В GroupEnumUnitsInRange выдаю бафы аур, в forgroup - убираю бафы, кто не подходят под условия.
А что быстрее, перебрать юнитов в группе или в хештаблице?
0
20
3 года назад
Отредактирован biridius
0
Можно сделать массив и перебирать юнитов порциями штук по 50 за раз вместо 500 за раз, распределив работу.
Типа каждые 0.01 сек отсчитал 50 юнитов, все, дальше в следующую долю секунды следующие 50 юнитов, и этот счетчик обнулять раз в секунду, возвращаясь в начало круга, чтобы каждый юнит обрабатывался один раз в секунду.
Рисовать в гуи я это все конечно не буду.
0
9
3 года назад
0
biridius:
Можно сделать массив и перебирать юнитов порциями штук по 50 за раз вместо 500 за раз, распределив работу.
Типа каждые 0.01 сек отсчитал 50 юнитов, все, дальше в следующую долю секунды следующие 50 юнитов, и этот счетчик обнулять раз в секунду, возвращаясь в начало круга, чтобы каждый юнит обрабатывался один раз в секунду.
Рисовать в гуи я это все конечно не буду.
Зачем? Имхо, лучше при получении ауры сохранять владельца, а потом проверять окружающих и раздавать баффы/дебаффы.
2
18
3 года назад
2
map_maiker:
Venommm:
PT153:
А что в этих условиях?
Проверка на тип юнита и наличие бафа или других подобных маркеров
Можно пример?
Ибо не очень ясно почему нельзя сразу проводить действия с нужными юнитами.
Изначально было как обычно, через множество групп с нужной выборкой и их очистку. Но было падение фпса, спустя определенное время игры. С помощью счетчика хендлов выяснили что "Pick every unit in" вызывает утечки. Был предложен такой вот метод выбора всех юнитов через локалку и с помощью ifthenelse отсеивать нужных. В принципе помогло с фпсом. Он стабильный. Но вот видимо все эти переборы вызывают микрофризы.
Самые простые примеры условий.
Пример

А с таким кол-вом условий поток не обрывается?
Всё нормально работает.
rsfghd:
Да и чёт я не понимаю вариант первого "безутечного" перебора группы. По факту ты глобальной переменной присвоил значение локальной, которая создание группы, затем ты уничтожаешь группу 2 раза через разные переменные, зачем? К тому же создавать и уничтожать группу не нужно, достаточно написать перед пиком группы set bj_wantDestroyGroup = true, и всё
Вот тут уже обсуждали это. Хендлы добавляются.

уничтожаешь группу 2 раза через разные переменные, зачем
2x удаление, это уже моя отсебятина в попытке как-то избавиться от фризов. Можно не обращать внимание на это. Очищаю один раз.

Zetox:
Я так понимаю, что перебираются все юниты на карте, затем для каждого перебирается куча условий, есть аура или нет ?. Делать надо не так, я реализую по другому - Когда выдаю юнита, создаю таймер к юниту, затем выбираю юнитов в области через GroupEnumUnitsInRange, заношу нужных юнитов в локальную группу, которая сейвится через хештаблицу к герою (кто излучает ауру). В GroupEnumUnitsInRange выдаю бафы аур, в forgroup - убираю бафы, кто не подходят под условия.
Если такой способ действительно эффективней, можно пожалуйста самый элементарный пример, хотябы в виде скрина.
Загруженные файлы
0
9
3 года назад
0
Изначально было как обычно, через множество групп с нужной выборкой и их очистку. Но было падение фпса, спустя определенное время игры. С помощью счетчика хендлов выяснили что "Pick every unit in" вызывает утечки. Был предложен такой вот метод выбора всех юнитов через локалку и с помощью ifthenelse отсеивать нужных. В принципе помогло с фпсом. Он стабильный. Но вот видимо все эти переборы вызывают микрофризы.
А утечки точно из-за самого выбора? Насколько знаю, нативные функции утечек не вызывают, а BJ реализация ForGroup вроде без утечек...
Мб дело в обработке группы было?
И на счёт групп - пробовали выделить заранее штук сто-двести глобальных групп и использовать по необходимости? Без создания новых.
Кстати, GetUnitsInRangeOfLocMatching() вроде вызывает утечку. Это получение группы юнитов, находящихся внутри окружности с радиусом и подходящих по условию. Утечка в том, что возвращается локальная переменная. Лечится как раз использованием глобальной переменной. (Глобальной переменной присваивается значение локальной, локальная обнуляется, глобальная возвращается)
Venommm:
Если такой способ действительно эффективней, можно пожалуйста самый элементарный пример, хотябы в виде скрина.
Вам ну гуи, да? По моему, на гуи так не получится. Насколько помню, GroupEnumUnitsInRange() и ForGroup() нет в действиях, а аналоги утечны. Но я могу и ошибаться, сужу по коду в Blizzard.j, а не по тестам.
Принятый ответ
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.