Старая тема на новой платформе. Попробовал переделать старый алгоритм отлова утечек с 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 апреля, но вопрос серьезный, вчера весь день просидел с ним, спасибо за понимание :)

konvan5, я помню еще эту поможет ли она тебе неизвестно
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Этот комментарий удален
25
Hate:
ты когда юнита создаешь, не думаешь же о том что он сам по себе исчезнет?
Уважаемый, вы говорите о другом, не пытаясь ответить на вопрос или как-то помочь.
Маленькая справка для вас: редактор варика не идеален и в нем есть функции, которые утечны, но при этом это не очевидно. К примеру если использовать в сложной конструкции функцию "взять позицию юнита", которая вернет нам точку - то получим утечку в виде этой точки. И если мы используем короткие периоды-таймеры, то куча таких утечек могут повлиять на игру. И проблема в том, что не все такие функции очевидно создают объект. Любой начинающий картостроитель об этом может даже не задумываться. Я, как и любой другой, не знаю всех функций, которые утечны. Для этого мне и нужен инструмент, чтобы находить утечные участки кода.
Может вы сможете расписать алгоритм для нахождения существования не удаленных объектов?
Если не можете помочь, то можете не писать очевидные вещи, которые не относятся к теме :)
13
Hate имеет в виду, что есть конкретный набор типов (хэндлы), которые утекают. Тебе просто нужно запомнить их, а не функции.

Все эти типы описаны в статьях 15-летней давности.
25
NekoriDes:
Hate имеет в виду, что есть конкретный набор типов (хэндлы), которые утекают. Тебе просто нужно запомнить их, а не функции.

Все эти типы описаны в статьях 15-летней давности.
Ну я хотел бы видеть, сколько у меня объектов в игре в данную секунду. Представлять и понимать, что утекает - это не проблема.
Проблема лишь в том, что я хочу видеть, сколько сейчас в игре есть объектов.
26
konvan5:
NekoriDes:
Hate имеет в виду, что есть конкретный набор типов (хэндлы), которые утекают. Тебе просто нужно запомнить их, а не функции.

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

Маленькая справка для вас
маленькая справка для тебя - я в редакторе варкрафта уже 10 лет минимум, и пишешь ты несусветную чушь, которую не знаю откуда ты понабирал.
если ты используешь гуи, тебя утечки должны волновать в последнюю очередь, если на коде - то как я уже написал, создал объект, удалил объект.
если ты пишешь в коде на бж функциях то это абзац и опять неясно зачем
24
Луа - другой язык и другая виртуальная машина, естественно там и управление памятью немного иначе реализовано.
25
Hate:
если ты используешь гуи, тебя утечки должны волновать в последнюю очередь, если на коде - то как я уже написал, создал объект, удалил объект.
А как понять, что объект удалился? Как проверить? Если я новичок и не доверяю функциям удаления. Смысл в этом.
7
konvan5:
Hate:
если ты используешь гуи, тебя утечки должны волновать в последнюю очередь, если на коде - то как я уже написал, создал объект, удалил объект.
А как понять, что объект удалился? Как проверить? Если я новичок и не доверяю функциям удаления. Смысл в этом.
отслеживай через диспетчер задач потребление памяти WarCraft'ом.
22
вроде у луа еше не завезли автосборшик мусора вам надо его вручную написать
33
pro100master, здрасте приехали, наоборот выпилили ручную сборку мусора, оставили только автоматику
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.