Старая тема на новой платформе. Попробовал переделать старый алгоритм отлова утечек с 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, я помню еще эту поможет ли она тебе неизвестно
`
ОЖИДАНИЕ РЕКЛАМЫ...
26
а сразу удалять объекты религия не позволяет, или что?
просто не особо понятен смысл этого
25
Hate:
а сразу удалять объекты религия не позволяет, или что?
Так в этом то и дело, что я не знаю всех функций, которые утечны и могу легко пропустить. Чтобы об этом узнать - я нашел давно наработку на джассе. Она вполне исправно работала. Теперь хочу попробовать поработать с LUA - но тут и возникают проблемы. Либо объекты не удаляются либо я неправильно их отлавливаю. Поэтому и прошу помочь, кто с этим сталкивался или у кого есть решение на LUA.
Этот комментарий удален
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, здрасте приехали, наоборот выпилили ручную сборку мусора, оставили только автоматику
26
konvan5:
Hate:
если ты используешь гуи, тебя утечки должны волновать в последнюю очередь, если на коде - то как я уже написал, создал объект, удалил объект.
А как понять, что объект удалился? Как проверить? Если я новичок и не доверяю функциям удаления. Смысл в этом.
а почему он не должен удалиться?
29
Это из разряда бухгалтеров, которые пытаются проверить компьютер на правильность вычислений...
13
Встаёт вопрос о том, что ты предпримешь узнав о количестве хендлов, если не доверяешь функциям удаления? Есть какой-то другой магический способ их удалять?

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

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

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

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

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

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

NekoriDes, это только опытные люди знают, где утекает. Как оптимизировать.
ну счетчик просто показывает увеличиваются ли хэндлы. Не жрет ли много код. Если где-то не предусмотрел, и че-то не оптимизировал, то может проверить. Часто бывает полезен метод исключения. Эту часть кода выключил, посмотрел перестало утекать, стало ли меньше. Значит там утекает. Смысл в том, чтобы посмотреть сколько хэндлов на карте, использовать меньше объектов, где-то сократить.
26
утекает там где ты не удаляешь объекты. это абсолютно прозрачный и логичный процесс, не удалил уже ненужный объект - он утекает, для этого не нужно иметь семь пядей в лбу.
тем более что дебаг и утечки связаны не более чем как никак, так что сравнение неуместное совершенно
Чтобы оставить комментарий, пожалуйста, войдите на сайт.