Добавлен Zeix
Есть способность которая использует дамми снаряд и таймер к нему.
local timer tt=CreateTimer()
local unit d=CreateUnit(p,id,x,y,a)
...
call SaveUnitHandle(sHash,id,1,d)
call TimerStart(tt,0.03,true,function func)
по выполнению таймер с юнитом удаляются.
local timer tt=GetExpiredTimer()
local integer id=GetHandleId(tt)
local unit d=LoadUnitHandle(sHash,id,1)
...
call RemoveUnit(d)
call FlushChildHashtable(sHash,id)
call DestroyTimer(tt)
Для отслеживания утечек использую библиотеку
раскрыть
library Leaks initializer LeaksInit
globals
leaderboard lboard
endglobals
function Callback takes nothing returns nothing
local location array loc
local integer a = 0
local integer index
local integer prevIndex = 0
local integer next = 0
loop
set loc[a] = Location(0., 0.)
set index = GetHandleId(loc[a]) - 0x100000
set a = a + 1
if index == prevIndex + 1 then
set next = next + 1
else
set next = 0
endif
set prevIndex = index
exitwhen next >= 15
endloop
call LeaderboardSetItemValue(lboard, 0, index - a)
loop
set a = a - 1
call RemoveLocation(loc[a])
set loc[a] = null
exitwhen a <= 0
endloop
endfunction
function Actions takes nothing returns nothing
local timer tim = GetExpiredTimer()
set lboard = CreateLeaderboard()
call LeaderboardSetLabel(lboard, "Handlers")
call PlayerSetLeaderboard(GetLocalPlayer(), lboard)
call LeaderboardDisplay(lboard, true)
call TimerStart(tim, 0.25, true, function Callback)
call LeaderboardAddItem(lboard, "Max Handles", 0, Player(0))
call LeaderboardSetSizeByItemCount(lboard, 1)
set tim = null
endfunction
function LeaksInit takes nothing returns nothing
call TimerStart(CreateTimer() , 0., false, function Actions)
endfunction
endlibrary
которая говорит, что при каждом юзе способности утекают 2 хендла (юнита и таймера соответственно). GetHandleId(d) каждый раз растет на 2.
Но мемхак и его ConvertHandle(d) при каждом непаралельном вызове возвращает одно и то же значение хендла юнита.
Собственно утечка или нет? и кто врет?
Но мемхак и его ConvertHandle(d) при каждом непаралельном вызове возвращает одно и то же значение хендла юнита.
Собственно утечка или нет? и кто врет?
Принятый ответ
адрес будет переиспользован, когда объект больше в игре не существует. хендл при этом может и не освободиться - т.е. прошлый останется навсегда "занятым". Реальный адрес никакой роли при этом не играет. RemoveUnit заставляет движок забыть о юните, что иногда чревато, лучше убивать, а потом таймером Remove, либо просто позволить ему разложиться (с тем же эффектом, но стандартная работа игры)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован avuremybe
Кому-то нужны хендлы не существующих объектов?
Но ситуацию понял, спасибо за пояснение.
в норме юнит удаляется из памяти после разложения трупа
у саммонов и иллюзий нет разложения и они удаляются сразу. если они были дальниками, то все запущенными ими снаряды будут ссылаться на несуществующего юнита, т.е. null. аналогично с удалением.
Каждая ссылающаяся на handle переменная, добавляет к счетчику единицу.
Уничтожение юнита уменьшает счетчик на единицу.
По достижению нуля ссылок, handle освобождается и может быть переиспользован.
Отредактирован PT153
Отредактирован PT153