Добавлен konvan5
Старая тема на новой платформе. Попробовал переделать старый алгоритм отлова утечек с jass на LUA, но утечки вообще не устраняются а из-за проверки даже добавляются. Проделал много экспериментов и так и не понял, хэндлы вообще уничтожаются либо нет. Либо просто счетчик идет только вперед а назад не возвращается. То есть при создании нового объекта создается хэндл больше чем максимальный хэндл, который был в игре (как я понял).
Вот мой код на LUA для отлова утечек.
sizehc = 50
HandleCounter_Update = function()
local i
local id
local P = {}
local result = 0
local min = -1
for i = 1, sizehc do
P[i] = Location(0,0)
id = GetHandleId(P[i])
id = id - 0x100000
if min == -1 then
min = id;
end
if id > result then
result = id
elseif id < min then
min = id
end
end
if result - min > sizehc then
result = min
else
result = result - sizehc
end
for i = sizehc, 1, -1 do
RemoveLocation(P[i])
P[i] = nil
end
LeaderboardSetItemValue(udg_HandleBoard, 0, R2I(result))
end
function HandleCounterScriptGo()
udg_HandleBoard = CreateLeaderboard()
LeaderboardSetLabel(udg_HandleBoard, "Handle Counter")
PlayerSetLeaderboard(GetLocalPlayer(), udg_HandleBoard)
LeaderboardDisplay(udg_HandleBoard, true)
LeaderboardAddItem(udg_HandleBoard, "Handles", 0, Player(0))
LeaderboardSetSizeByItemCount(udg_HandleBoard, 1)
HandleCounter_Update()
TimerStart(CreateTimer(), 0.5, true, HandleCounter_Update)
end
была еще более простая версия без min и sizehc, но там проблема та-же
А вот и эта другая версия функции HandleCounter_Update, упрощенная
HandleCounter_Update = function()
local i
local id
local P = {}
local result = 0
for i = 1, 50 do
P[i] = Location(0,0)
id = GetHandleId(P[i])
result = result + (id-0x100000)
end
result = result/50-25
for i = 50, 1, -1 do
RemoveLocation(P[i])
P[i] = nil
end
LeaderboardSetItemValue(udg_HandleBoard, 0, R2I(result))
end
В чем же может быть проблема? Неправильно удаляю утечки? Неправильно пытаюсь их найти? Может механизм создания хэндлов и правда изменился в рефордже и я этого не понял.
Вопрос был задан 1 апреля, но вопрос серьезный, вчера весь день просидел с ним, спасибо за понимание :)
Вопрос был задан 1 апреля, но вопрос серьезный, вчера весь день просидел с ним, спасибо за понимание :)
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Маленькая справка для вас: редактор варика не идеален и в нем есть функции, которые утечны, но при этом это не очевидно. К примеру если использовать в сложной конструкции функцию "взять позицию юнита", которая вернет нам точку - то получим утечку в виде этой точки. И если мы используем короткие периоды-таймеры, то куча таких утечек могут повлиять на игру. И проблема в том, что не все такие функции очевидно создают объект. Любой начинающий картостроитель об этом может даже не задумываться. Я, как и любой другой, не знаю всех функций, которые утечны. Для этого мне и нужен инструмент, чтобы находить утечные участки кода.
Может вы сможете расписать алгоритм для нахождения существования не удаленных объектов?
Если не можете помочь, то можете не писать очевидные вещи, которые не относятся к теме :)
Ред. konvan5
Проблема лишь в том, что я хочу видеть, сколько сейчас в игре есть объектов.
Ред. konvan5