Привязываю к юниту что-то через хеш-таблицу, например:
	call SaveInteger( hashtable, GetHandleId( whichUnit ), 0, integer )
Но привязываю, только, если ранее к этому юниту не привязывалось, то есть:
	if not HaveSavedInteger( hashtable, GetHandleId( whichUnit ), 0 ) then
		call SaveInteger( hashtable, GetHandleId( whichUnit ), 0, integer )
	endif
Так вот, проблема вот в чем: на карте создаётся огромное количество юнитов и к ним крепятся данные, как написано выше. Эти юниты удаляются после смерти и их хендл освобождается, для другого нового созданного юнита. И в итоге, я к юниту не могу что-либо крепить, потому что проверка выдаёт, что в хеш-таблице по данному ключу уже что-то сохранено, потому что новый юнит занял хендл старого юнита. Как это обойти?

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

вариант №1 - не нулить переменные, оставляя утечки номеров хендлов. это безопасно, да, если знаешь, что делаешь.
№2 - ловить UNIT_DEATH и чистить за ним

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
28
7 лет назад
Отредактирован Кет
0
DracoL1ch, я бы 2 вариант юзал
с первым могут быть проблемы если есть арифметика с хэндлами
да и делать намеренную утечку памяти вместо того чтобы просто чистить за собой данные это какой-то жуткий костыль
0
16
7 лет назад
0
nvc123:
это не утечка, это сохранение id хендла, не более. на память не влияет от слова никак, разрушь объект - и сборщик его уберет.
0
29
7 лет назад
0
ну если ты ловишь юнит_дес и чистишь табличку а там вдруг ульт паладина то действительно будет баг.
0
28
7 лет назад
Отредактирован nvc123
0
Doc, ну так учитывать рес надо, это всегда при отлове смерти проверять надо
DracoL1ch, на память это влияет как минимум тем что хэш таблица забита не используемыми значениями
2
26
7 лет назад
2
что бы не было непоняток с ультой паладина, можно удалять значения таблицы по мере того как труп разложился до такой степени, что уже не сможет быть воскрешен. банальный таймер.
0
16
7 лет назад
0
А еще можно просто не юзать ульт паладина. Ну а мусорка в хештаблице у ТС и так, и так
0
7
7 лет назад
0
GetUnitTypeId() вернет рав-код юнита, даже если он разлагается, что может помочь в поиске мусора
2
21
7 лет назад
2
Ige, GetUnitTypeId() вернет же одинаковое значение для одинаковых юнитов.
0
7
7 лет назад
0
ScopteRectuS, как делаю я
Когда креплю данные к юниту через хт, добавляю его в группу. По группе периодически пробегаюсь, ищу несуществующих юнитов (GetUnitTypeId() вернет 0, если юнита больше нет на карте) и если нахожу, то очищаю данные в хт.
0
23
7 лет назад
0
самый оптимальный это юнит покинул облость вся карта... после чего можно уже его удалить данные покинувший есть уже наработка index unit
0
21
7 лет назад
Отредактирован scopterectus
0
Ige, а как же (unit == null) ?
pro100master, я думаю, это не сработает. Т.к. юнит покинет игровую карту только тогда, когда он плоностью разложится (а если труп разлагается полностью - игра его удаляет). Соответственно когда заюзаешь функцию получения юнита, покунувшего регион, игра вернет null.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.