Старая тема на новой платформе. Попробовал переделать старый алгоритм отлова утечек с 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, я помню еще эту поможет ли она тебе неизвестно
`
ОЖИДАНИЕ РЕКЛАМЫ...

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

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

Маленькая справка для вас
маленькая справка для тебя - я в редакторе варкрафта уже 10 лет минимум, и пишешь ты несусветную чушь, которую не знаю откуда ты понабирал.
если ты используешь гуи, тебя утечки должны волновать в последнюю очередь, если на коде - то как я уже написал, создал объект, удалил объект.
если ты пишешь в коде на бж функциях то это абзац и опять неясно зачем
3
24
4 года назад
3
Луа - другой язык и другая виртуальная машина, естественно там и управление памятью немного иначе реализовано.
0
23
4 года назад
Отредактирован konvan5
0
Hate:
если ты используешь гуи, тебя утечки должны волновать в последнюю очередь, если на коде - то как я уже написал, создал объект, удалил объект.
А как понять, что объект удалился? Как проверить? Если я новичок и не доверяю функциям удаления. Смысл в этом.
2
7
4 года назад
2
konvan5:
Hate:
если ты используешь гуи, тебя утечки должны волновать в последнюю очередь, если на коде - то как я уже написал, создал объект, удалил объект.
А как понять, что объект удалился? Как проверить? Если я новичок и не доверяю функциям удаления. Смысл в этом.
отслеживай через диспетчер задач потребление памяти WarCraft'ом.
0
23
4 года назад
0
вроде у луа еше не завезли автосборшик мусора вам надо его вручную написать
2
32
4 года назад
2
pro100master, здрасте приехали, наоборот выпилили ручную сборку мусора, оставили только автоматику
2
23
4 года назад
2
0
26
4 года назад
0
konvan5:
Hate:
если ты используешь гуи, тебя утечки должны волновать в последнюю очередь, если на коде - то как я уже написал, создал объект, удалил объект.
А как понять, что объект удалился? Как проверить? Если я новичок и не доверяю функциям удаления. Смысл в этом.
а почему он не должен удалиться?
2
27
4 года назад
2
Это из разряда бухгалтеров, которые пытаются проверить компьютер на правильность вычислений...
0
13
4 года назад
0
Встаёт вопрос о том, что ты предпримешь узнав о количестве хендлов, если не доверяешь функциям удаления? Есть какой-то другой магический способ их удалять?

В аналогии с бухгалтером, ты хотя бы сам посчитать сможешь, а тут вообще бессмыслица какая-то получается.
3
23
4 года назад
3
NekoriDes:
Встаёт вопрос о том, что ты предпримешь узнав о количестве хендлов, если не доверяешь функциям удаления? Есть какой-то другой магический способ их удалять?
Да это я уже на крайности перешел, ибо люди не пытались ответить на вопрос, а спрашивали, зачем надо и твердили о простой истине - иди и удаляй. Но мы не все перфекционисты, часто ленивы или забывчивы, из-за чего можем не всегда сразу удалять объекты, когда это надо. Поэтому такая система была бы неким контроллером, что все идет ок и нигде не начинается собираться свалка невидимого мусора.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.