Главная » Статьи » Базовые знания

Утечки памяти или как убрать лаги в карте

Предисловие

Многие видели, что карты могут подвисать даже на мощных компьютерах. Это явление вызвано утечками памяти, приводящими к небольшим лагам или полному повисанию карты. В этой статье описывается как устранять утечки и к ней приложена карта-пример.


Утечки памяти


Их могут вызвать предметы, декорации, регионы, точки, группы юнитов, плавающий текст и другие объекты, после которых остаётся не удалённая информация в памяти. Рассмотрим самое элементарное:

1)      •Триггеры с малым периодом

2)      •Спецэффекты

3)      •Звуки

4)      •Юниты

5)      •Точки

Далее рассмотрим, как правильно писать триггеры, что б не было утечек:


Триггеры с малым периодом


Это периодические триггеры, которые например, срабатывают каждые пять секунд. Такой триггер будет вызывать лаги в том случае, если во времени срабатывания стоят десятые или сотые доли секунды и в триггере слишком много действий (особенно тех, которые описаны ниже). Для исправления глюков необходимо уменьшить периодичность срабатывания или количество действий в триггере. Лучше избегать создание таких триггеров или создавать их как можно меньше.


Спецэффекты


Когда триггерно создаётся спецэффект (на юните или в области), ему выделяется память в игре. После проигрывания спецэффекта он не виден, но находится в памяти и занимает там место. Чтоб очистить память, после проигрывания спецэффекта создаём это нехитрое действие:


Спецэффект полностью проиграется и  удалиться.


Звуки


Звуки забивают памать аналогично спецэффектам. Лечится это теми же методами:


Удаление звука происходит так же, как и спецэффекта (см. выше)


Юниты


Очень часто это происходит в TD, когда после смерти крипов остаются лежать трупы. Они занимают место в памяти так же, как и живой юнит (до полного разложения), поэтому после смерти нужно удалять труп:


После написания подобного триггера трупов после смерти оставаться не будет, и это разгрузит игровую память, особенно если в карте имеются большие волны крипов.


Точки


Точка, как и все созданные во время игры объекты занимает память. Для устранения утечки нужно сначала создать точку, записать в переменную типа «точка», сделать с этой точкой действие, а лишь потом удалять:


Джас код:

call RemoveLocation( udg_TempPoint )

Где «TempPoint» имя переменной.

Для каждой новой точки создавать переменную не нужно, можно эти данные записать в старую переменную.

На заметку

Чтобы немного увеличить ресурс памяти, нужно проделать следующее:


Джас код:

call DoNotSaveReplay()

При создании такого триггера не будет записываться реплей, и память немного разгрузится.


Заключение


Утечку может вызвать любой объект, который создался во время игры. Если он в дальнейшем не используется, то его нужно обязательно удалить, иначе со временем игровая память закончится. Но не все карты требуют оптимизации и полного удаления утечек. В первую очередь это многопользовательские карты и карты с малым периодом триггеров. Остальное нужно смотреть по работоспособности карты, будет она подвисать или нет.

Карта пример к статье: Устранение утечек памяти.w3x


Категория: Базовые знания | Добавил: Stinger (18.04.2012) | Автор: Stinger E W
Просмотров: 4304 | Теги: Утечка, утечки памяти, устранение учечек
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]