Делаю одну большую карту на Warcraft 3 и столкнулся с проблемой утечек - почти стабильный краш примерно на 2 часу игры. Всё делаю (только не бейте) на обычном GUI, как я понял из поиска в интернете - это проблема с утечками, и скорее всего с точками создания юнитов.
Собственно, суть вопроса.
Избавлюсь ли я от утечек с точками, если будут перед каждым спавном иметь какую то переменную точки (назовём её P) и юнит будет создаваться не в "Область 019", а в "P", которая всегда меняется.
Избавлюсь ли я от утечек юнитов, если спустя n-минут после смерти труп удаляется действием "Боевая единица - Удалить".
Избавлюсь ли я от утечек спецэффектов, если аналогично юнитам, спецэффекты (и плавающий текст) удаляются спустя n-минут?
Нужно ли добавить к этому всему что то ещё?
Пы.сы. те статьи от бота я уже посмотрел, но не нашёл того, чего хотел

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

Надо, конечно, взглянуть на триггеры в карте, но при спавне удалять нужно не только точки, но и группы, так как при спавне создаются не только юниты, но и группа для них (даже из одного юнита группы). Без утечек создание юнитов выглядит так:
вот код для custom script:
call DestroyGroup( GetLastCreatedGroup() )
call RemoveLocation( udg_P )
Если отдаёшь приказ группе юнитов отправиться в область, там тоже создаётся группа и точка, тоже нужны эти custom script. Но вообще сомнительно, что это вызывает дикие лаги через два часа. Наверное, есть какие-то события с малым периодом, что тоже плодят утечки, поэтому и надо триггеры в карте смотреть.
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...

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

ответ
Какой ужас
Делай вот так.
бронепоезд
создать.
направить на 128 точек наверх(90)
сделать неперманентным
текст удалится через 3 секунды
текст затухнет до 100% прозрачности через 3 секунды
Вот чёрт. не успел приплюснуть к посту.
ответ
Ну еще и 100500 юнитов могут начать лагать, 60+ на игрока которые куда то бегут уже не хорошо.
Так же советую сделать всех юнитов суммонами, чтобы они не разлагались
call UnitApplayTimedLife( unit, 'BFig', 0.00 ) это существенно снизит нагрузку на движок
P.S в ваших юнитах совсем не разобрался, какой то кавардак - нету четкого разделения на юнитов для волн, боссы, суммоны героев, герои игроков....
ответ
Прошу прощения, перепроверил, не течет, занимает 4 хендла на время действия, потом чистит
ответ
Steal nerves:
объяснение
если герой удалил с помощью репик героя
Не понял что ты написал, если имеешь в виду удалить героя (RemoveUnit), то это событие никогда не запустит поток, так как объекта то уже нет (удален). Не должно по идее. Во-вторых, нельзя удалить событие. Событие обычно вешают (регистрируют) на объекты (юниты, игроки и др), большая часть стандартных событии (юнит умирает, юнит применяет абилу и др короче общие события) - вешают (регистрируют) на игроков. Короче событие - рычаг, который фиксирует изменения объекта. Есть другие еще событие со временем - "запускать каждые ... секунд" - тоже рычаг, но переменных не дает (типа Dying Unit(), GetTriggerUnit() и др)
Если смотреть по поводу того утечек и как лучше сделать/оптимизировать случаи с единичными событиями, которые вешают на одного юнита:
  1. есть два варианта либо вешаешь все на один триггер события разных юнитов (еще нужно в некоторых случаях запихивать юнитов в группу для проверки, если там такой юнит есть, то не нужно добавлять) и не париться (рабочий вариант). Пример_GUI_Impetus,
  2. Или создаешь каждый раз новый триггер, регистрируешь на него событие юнита (пример при атаке), (так было сделано в доте, видимо для успешной атаки, типа отслеживаешь что это был физический удар, скилл Impetus), потом ссылки на action и condition запоминаешь в переменные или в хэшз, затем удаляешь условие/действие, и триггер удалить. Условие можно не удалять, кто-то писал что не нужно
Можно привести к моему выводу, что событие не удалить. Тестировал давно функции ссылка на игроках, Рисую ситуацию: на игрока зарегистрировал событие (применить скилл), прикрепил также к триггеру условие и действие.
Игрок запускает способность => срабатывает событие => проходит проверка условия => действие.
Если убрать действие или условие, то рычаг все равно работает. Отсюда следует вывод: даже будь хоть выключен триггер, событие все равно работает. Функция GetTriggerEvalCount - этой функции можно проверить сколько раз запускал условие с событием. Но как-то пробовал еще и без условия проверить, прокатывает и на событие походу (точнее это счетчик на событие). Так как рычагом является игрок. А если рычагом станет не игрок, а юнит (часто систему урона на него вешают), то там юнита можно удалить, и событие никогда не заработает, так как его уже нет
Что хочу сказать. Если у тебя 50 триггерных скилов, и 50 триггеров с одним и тем же событием, лучше его оптимизировать, на одно событие. Где-то была ссылка
это будет надеюсь понятно
ответ
Steal nerves:
Alexey103, а у меня работает, проверял. тут ошибка в названии переменной, скорее всего, зачем ты задал такое. Мб оно слишком длинное и через нижнее подчеркивание? и путь модель указывают в jass не через один обратный слэш "/", а через двойной слэш "//". Это на гуи один, на джаз два слэша

3
16
5 лет назад
3
1
7
5 лет назад
1
Помогут статьи:
  1. Оптимизация - тык
  2. Оптимизация: утечки памяти - тык
Также по утечкам овер-много вопросов, так что по каждому случаю найдешь уже похожий вопрос->ответ.
Плюс, небольшой наглядный пример из пака наработок по их устранению.
Загруженные файлы
2
27
5 лет назад
Отредактирован MpW
2
по идее юнита не нужно удалять вручную (это то что написано в статье). он сам удалиться. и из группы удалиться тоже. игра сама удаляет. был тут анимешник по наруто, где везде пихал удаление после смерти. в каждом триггере (надо было просто один триггер на все сделать для удобства, группировать в ро удаляемых юнитов единой классификацией ). потом удивлялся, почему у него герой не воскрешается, а удаляется из игры (надо правильно пользоваться триггерами, условиями). карта у него лагала катастрофически из-за множества моделек видимо. это даймиков можно. хотя даймикам можно таймер смерти нацепить

подумайте об минусах мгновенного удаления: так вы не получаете трупов для некоторых заклинаний воскрешения и некромантии.

оптимизация нужна в том случае, если создал объект вроде таймера. сделал таймер свое дело, удалил - все
0
26
5 лет назад
0
Надо, конечно, взглянуть на триггеры в карте, но при спавне удалять нужно не только точки, но и группы, так как при спавне создаются не только юниты, но и группа для них (даже из одного юнита группы). Без утечек создание юнитов выглядит так:
вот код для custom script:
call DestroyGroup( GetLastCreatedGroup() )
call RemoveLocation( udg_P )
Если отдаёшь приказ группе юнитов отправиться в область, там тоже создаётся группа и точка, тоже нужны эти custom script. Но вообще сомнительно, что это вызывает дикие лаги через два часа. Наверное, есть какие-то события с малым периодом, что тоже плодят утечки, поэтому и надо триггеры в карте смотреть.
Загруженные файлы
Принятый ответ
0
7
5 лет назад
0
Steal nerves:
по идее юнита не нужно удалять вручную (это то что написано в статье). он сам удалиться. и из группы удалиться тоже. игра сама удаляет. был тут анимешник по наруто, где везде пихал удаление после смерти. в каждом триггере (надо было просто один триггер на все сделать для удобства, группировать в ро удаляемых юнитов единой классификацией ). потом удивлялся, почему у него герой не воскрешается, а удаляется из игры (надо правильно пользоваться триггерами, условиями). карта у него лагала катастрофически из-за множества моделек видимо. это даймиков можно. хотя даймикам можно таймер смерти нацепить

подумайте об минусах мгновенного удаления: так вы не получаете трупов для некоторых заклинаний воскрешения и некромантии.

оптимизация нужна в том случае, если создал объект вроде таймера. сделал таймер свое дело, удалил - все
у меня триггеры не мои были я учился просто копировал и т.д теперь знаю
кстати карта не лагает
0
9
5 лет назад
Отредактирован Lord_Tomat
0
Steal nerves:
по идее юнита не нужно удалять вручную (это то что написано в статье). он сам удалиться. и из группы удалиться тоже. игра сама удаляет. был тут анимешник по наруто, где везде пихал удаление после смерти. в каждом триггере (надо было просто один триггер на все сделать для удобства, группировать в ро удаляемых юнитов единой классификацией ). потом удивлялся, почему у него герой не воскрешается, а удаляется из игры (надо правильно пользоваться триггерами, условиями). карта у него лагала катастрофически из-за множества моделек видимо. это даймиков можно. хотя даймикам можно таймер смерти нацепить

подумайте об минусах мгновенного удаления: так вы не получаете трупов для некоторых заклинаний воскрешения и некромантии.

оптимизация нужна в том случае, если создал объект вроде таймера. сделал таймер свое дело, удалил - все
В карте трупы никак не используются, героев нету и воскрешение не продумано, меня это не волнует.
8gabriel8:
Надо, конечно, взглянуть на триггеры в карте, но при спавне удалять нужно не только точки, но и группы, так как при спавне создаются не только юниты, но и группа для них (даже из одного юнита группы). Без утечек создание юнитов выглядит так:
вот код для custom script:
call DestroyGroup( GetLastCreatedGroup() )
call RemoveLocation( udg_P )
Если отдаёшь приказ группе юнитов отправиться в область, там тоже создаётся группа и точка, тоже нужны эти custom script. Но вообще сомнительно, что это вызывает дикие лаги через два часа. Наверное, есть какие-то события с малым периодом, что тоже плодят утечки, поэтому и надо триггеры в карте смотреть.
Я думаю, это поможет, но тут ещё вопрос
Предметы считаются за юнита? Что насчёт "Заменённых" юнитов?
Пы.сы. в триггерах самый "частый" тригер - установка рандомного числа в переменную раз в 20 секунд, остальные идут от минуты до пяти
0
26
5 лет назад
0
Предмет - это своеобразный объект, как юнит или декорация, но не юнит. Заменённые юниты теоретически не должны утекать, но тут зависит от реализации, вдруг каждого юнита прогоняешь через глобальную переменную перед заменой, тогда утечки будут, но раз уж ты спросил о них, то лучше посмотреть.
P. S. Имею ввиду не обязательно время, но и вообще что-то частое. Например, при каждой атаке создаётся эффект, который не удаляется.

Меня вообще мало волнуют утечки, так как занимаюсь кампаниями, а не мультиплеерными картами, просто наблатыкался с этим, так как много здесь сижу. Но вообще создали много разных триггеров для вывода количества утечек - счётчики хендлов. Поищи такой, поставь себе в карту и прикидывай, как меняется количество утечек в игре, когда проводишь чистку в триггерах, может в какие-то моменты особенно сильный рост утечек будет.
Там будет выводится число, которое показывает, что такое-то количество объектов хранится в памяти. По ходу игры счётчик будет немного расти и падать, что нормально. Если же счётчик по сути лишь растёт, значит надо убирать утечки. Идеально будет, если по ходу игры счётчик почти не будет меняться, но это задротство, не стремись к этому, просто знай, что стабильность - это хорошо.
Ещё не факт, что именно утечки вызывают фатал.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.