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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
3
24
4 года назад
3
NekoriDes:
Встаёт вопрос о том, что ты предпримешь узнав о количестве хендлов, если не доверяешь функциям удаления? Есть какой-то другой магический способ их удалять?
Да это я уже на крайности перешел, ибо люди не пытались ответить на вопрос, а спрашивали, зачем надо и твердили о простой истине - иди и удаляй. Но мы не все перфекционисты, часто ленивы или забывчивы, из-за чего можем не всегда сразу удалять объекты, когда это надо. Поэтому такая система была бы неким контроллером, что все идет ок и нигде не начинается собираться свалка невидимого мусора.
0
13
4 года назад
0
konvan5:
NekoriDes:
Встаёт вопрос о том, что ты предпримешь узнав о количестве хендлов, если не доверяешь функциям удаления? Есть какой-то другой магический способ их удалять?
Да это я уже на крайности перешел, ибо люди не пытались ответить на вопрос, а спрашивали, зачем надо и твердили о простой истине - иди и удаляй. Но мы не все перфекционисты, часто ленивы или забывчивы, из-за чего можем не всегда сразу удалять объекты, когда это надо. Поэтому такая система была бы неким контроллером, что все идет ок и нигде не начинается собираться свалка невидимого мусора.
Так ведь счётчик хендлов тут вряд ли поможет. Т.е. ты всё равно не знаешь где именно ты забыл удалить очередной и тебе придётся делать код ревью. Короче говоря, знание КОЛИЧЕСТВА не даёт тебе ничего вообще.

Не представляю даже область его применения в 1.26-.

Если только в качестве демонстрации каких-нибудь сложных систем.
4
24
4 года назад
Отредактирован konvan5
4
NekoriDes:
Так ведь счётчик хендлов тут вряд ли поможет. Т.е. ты всё равно не знаешь где именно ты забыл удалить очередной и тебе придётся делать код ревью. Короче говоря, знание КОЛИЧЕСТВА не даёт тебе ничего вообще.

Не представляю даже область его применения в 1.26-.

Если только в качестве демонстрации каких-нибудь сложных систем.
Как раз таки дает, ибо код, который я предоставил - обновляется ежесекудно и зная, видя, в какой момент они растут сильно - легко можно определить, в какой системе недосмотрел. Даже если прибавка идет относительно медленно - периодичность все равно во время игры можно связать с игровым фактором (тот-же спавн юнитов, особый скил или еще какая система). Что в разы облегчает полное ревью кода.
Применял еще 5 лет назад на джассе, было удобно, когда видишь, как память забита.
0
26
4 года назад
0
а можно сразу думать об удалении мусора
а то получается, создал себе проблему, а затем героически ее решаешь
опять же, сразу нельзя решать ее?
7
12
4 года назад
7
Hate:
а можно сразу думать об удалении мусора
а то получается, создал себе проблему, а затем героически ее решаешь
опять же, сразу нельзя решать ее?
Это из разряда "дебаг не нужен, просто пишите код без ошибок с первого раза".
1
24
4 года назад
1
Sergarr:
Это из разряда "дебаг не нужен, просто пишите код без ошибок с первого раза".
Именно! ;)
0
13
4 года назад
0
Хендлкаунтер и дебаг так себе связаны. Ты ведь не отлаживаешь сразу всё, а отдельные части? Просто проблема и её решение высосаны из пальца. Тут явно имеет место быть некомпетентность программиста, а не реальная нужда в инструменте.
(и это тебе жабаскрипт макакен говорит, который дальше скриптовых языков не заходил, задумайся!)
2
27
4 года назад
Отредактирован MpW
2
На сайте НазерПанк выкладывал наработку LUA определения утечек.

Еще кучу ссылок кидали на LUA

NekoriDes, это только опытные люди знают, где утекает. Как оптимизировать.
ну счетчик просто показывает увеличиваются ли хэндлы. Не жрет ли много код. Если где-то не предусмотрел, и че-то не оптимизировал, то может проверить. Часто бывает полезен метод исключения. Эту часть кода выключил, посмотрел перестало утекать, стало ли меньше. Значит там утекает. Смысл в том, чтобы посмотреть сколько хэндлов на карте, использовать меньше объектов, где-то сократить.
2
26
4 года назад
2
утекает там где ты не удаляешь объекты. это абсолютно прозрачный и логичный процесс, не удалил уже ненужный объект - он утекает, для этого не нужно иметь семь пядей в лбу.
тем более что дебаг и утечки связаны не более чем как никак, так что сравнение неуместное совершенно
0
18
4 года назад
0
А что в lua нет проблемы циклических ссылок?
0
24
4 года назад
0
Steal nerves:
На сайте НазерПанк выкладывал наработку LUA определения утечек.
Спасибо, нашел эту статейку. Вдруг кому еще пригодится.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.