Добавлен 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, либо просто позволить ему разложиться (с тем же эффектом, но стандартная работа игры)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Zeix
и я не вижу =null в конце использования локальных переменных
Zeix, И где тут мемхак? Не вижу что то применение мемхака в данном коде, вот к примеру тут используется мемхак, а у вас нет.
DracoL1ch: Параллельно, я имел ввиду МУИ использование. То есть если я использую способность Варик создаст юнита в памяти (ConvertHandle вернет адрес этого юнита в памяти) после выполнения удалив юнита, память освободится. При новом вызове варик создаст нового юнита и опять выделит под него память, а ConverHandle будет тот же самый, значит прошлый юнит удалился и освободил место для нового. Если вызвать способность дважды, создастся два юнита и получат разные места в памяти, и ConvertHandle будет различаться, что и происходит. Поправьте меня если я не прав.
quq_CCCP: Мемхак не используется в способности, чего я и не утверждал, Я использовал только ее функцию, что бы понять что происходит.
GetHandleId() - ни имеет никакого отношения к мемхаку, мемхак основан на ретурнбаге типа code и array, code в свою очередь никак не связан с handle.
Отредактирован avuremybe
Кому-то нужны хендлы не существующих объектов?