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

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

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

ответ
Какой ужас
Делай вот так.
бронепоезд
создать.
направить на 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 не через один обратный слэш "/", а через двойной слэш "//". Это на гуи один, на джаз два слэша

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

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

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

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

оптимизация нужна в том случае, если создал объект вроде таймера. сделал таймер свое дело, удалил - все
у меня триггеры не мои были я учился просто копировал и т.д теперь знаю
кстати карта не лагает
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.