Функция RemoveItem() удаляет предмет с карты, но не удаляет из памяти игры, AgentMemoryMonitor показывает 5000+ предметов, а их нет, и у меня фпс падает
Я что-то не так делаю или функция кривая?

При создании предмета, игра добавляет его в список CWorldFrameWar3::m_enumeratedItems, но при уничтожении тот не удаляется из него, да и вообще этот список не используется.
Эта утечка не так страшна, как в случае с неудаляемыми подобраными книгами, так как предмет "мёртв".
При желании, эту утечку можно исправить, затерев код добавления предмета в список из этой функции:
код
// Game.dll + 0x39A3C0
void __thiscall CWorldFrameWar3::AddNewItem(CWorldFrameWar3 *this, CItem *pItem)
{
    CItem **slot;

    slot = TSGrowableArray<CAgentPtr<CItem>>::New(&this->m_enumeratedItems);
    CAgentPtr<CItem>::operator=(slot, pItem);
    CWorldFrameWar3::UpdateItem(this, pItem);
}
`
ОЖИДАНИЕ РЕКЛАМЫ...
7
Блин да даже когда книги берутся, они из памяти не вычищаются
Вот это прикол, а что это такое? Их вообще нельзя вычистить из памяти чтоли?
Ответы (1)
7
Блин да вообще не важно что я с ними делаю, удаляю героя с предметами, удаляю предметы, книги вообще сами по себе не удаляются а просто у них "Анимация смерти" начинается и они остаются
Да как блин их нафиг из памяти выкинуть то, а-а-а-а-а!!! Памагите!!!😭
7
Книжки не удаляются - это давно известный факт, там багованые модельки. Обычные предметы прекрасно удаляются. Только что проверил в рефе создав и удалив 10к предметов.
Ответы (1)
7
Zeix, у меня 1.26, то что книги не удаляются я знаю, но обычные предметы у меня тоже не удаляются, моделька с карты полностью удаляется (именно удаляется, а не становится маленькой), а вот из памяти они не стираются у меня
9
Как выше уже сказали, удалить предмет-книгу полностью нельзя. Но вот другое решение от меня.
Пусть герои собирают не книги-предметы, а юнитов-предметов.
Шаг первый: создаём юнита-книгу, меняем ему название и модельку. При желании можешь сделать несколько.
Шаг второй: делаем триггер, повышающий атрибуты героя при применении книги.
Таким методом можно полностью избавиться от утечек. Если захочешь, можешь попробовать сделать юнитов-руны и прочее.
22
Событие - юнит получает предмет
Условие - манипулируемый предмет это книга
Действие - удалить манипулируемый предмет (remove item)
Тогда книги должны будут удаляться
Ответы (11)
7
EugeAl, Нет-нет, вы не поняли, у меня не удаляются не только книги, у меня не удаляются вообще любые предметы
Точнее, с карты они полностью удаляются, модели (даже той маленькой от книг) не остаётся
Но в памяти они остаются и это сильно нагружает когда их много
32
Tredor46, ну так нужно их удалять при вручении, либо хп им ставить. и удалять.
7
quq_CCCP, да не, я их использовал чтобы рандомно-спавнящиеся по всей карте юниты криво не спавнились, например в воде там и т.д., прийдётся видимо использовать метод из другого твоего ответа который был несколько лет назад (ставить точки по всей карте в нужных местах и спавнить примерно на них)
22
Tredor46, да, интересно.
Ок, а как тогда ведут себя предметы, если использовать функцию UnitRemoveItem() или сначала сделать SetWidgetLife( item, 0.00 ) то есть убить предмет, а потом удалить?
7
EugeAl, Вечером или завтра попробую сделать то что вы написали, отппишусь когда проэксперементирую
7
EugeAl, Нет, Agent Memory Monitor показывает что он всё ещё жив
7
EugeAl, Ну всмысле, в памяти жив, никуда не очистился
22
Tredor46, Понятно. Тогда вопрос - а юниты удалённые и деревья в Agent Memory Monitor тоже живы? Или удаляются?
Если удаляются, тогда придётся оптимизировать спавн предметов
Если нет, то вообще всё перелопачивать
7
EugeAl, Удаляются конечно, если б не удалялись лагало бы
7
EugeAl, Варкрафт (1.26а) вообще не хочет вычищать предметы, я их и Удалял, и Продавал, и брал героя с предметами и Удалял, всё равно в пишет что они там есть, всё остальное нормально очищается (кроме приказов, пока не разобрался как их чистить, может быть и никак)
И я бы подумал что программа фигня, но я тестил карту с засореним этими предметами и без, ну и конечно когда ими память была засрана, у меня лагало, моделька у них была стандартная "сундучёк"
22
Tredor46, значит функция глюкавая, нужно переделывать спавн, чтоб не так много предметов было. Или присобачить счётчик, чтоб не спавнило больше 2к предметов, например, и не удалять предметы, а как то по другому использовать...
Попробуй также написать IceFog у, он шарит в движке, может быть запилит какой нибудь удалятор предметов)
18
При создании предмета, игра добавляет его в список CWorldFrameWar3::m_enumeratedItems, но при уничтожении тот не удаляется из него, да и вообще этот список не используется.
Эта утечка не так страшна, как в случае с неудаляемыми подобраными книгами, так как предмет "мёртв".
При желании, эту утечку можно исправить, затерев код добавления предмета в список из этой функции:
код
// Game.dll + 0x39A3C0
void __thiscall CWorldFrameWar3::AddNewItem(CWorldFrameWar3 *this, CItem *pItem)
{
    CItem **slot;

    slot = TSGrowableArray<CAgentPtr<CItem>>::New(&this->m_enumeratedItems);
    CAgentPtr<CItem>::operator=(slot, pItem);
    CWorldFrameWar3::UpdateItem(this, pItem);
}
Принятый ответ
Ответы (5)
22
IceFog, Огромное спасибо за оперативный ответ!
Осталось понять, чем открыть, поправить эту функцию
и сохранить/перезаписать game.dll, чтобы там ничего другое не сломалось)
Затирать, как я понимаю, нужно все что в скобках { }
7
IceFog, Ну как не страшна, помоему страшна, когда у меня 2000 мобов на карте стоит, то всё чики-пуки
Но когда 2000 Мобов + 5000 этих "удалённых предметов", играть уже невозможно
Спасибо за ответ, но пока так и не понял как затирать код добавления, когда поумнею, пойму
7
EugeAl, Не, в скобках помоему сам метод, вот эта строчка добавления
void __thiscall CWorldFrameWar3::AddNewItem(CWorldFrameWar3 *this, CItem *pItem)
От неё надо избавляться
22
Tredor46, там строчка
slot = TSGrowableArray<CAgentPtr<CItem>>::New(&this->m_enumeratedItems)
Она напоминает добавление в тот самый массив или список, и ещё и находится в теле функции
А если первую строку удалить, будет ошибка, как если удалить функцию из джасса, но оставить её внутренности снаружи
7
EugeAl, Да, скорее это и есть, ладно, я фигню до этого сказал, если же весь метод снести предмет же не будет спавниться, извиняюсь
28
Установи хп итема на значение больше нуля и потом удаляй. Древний баг, я описал его тут.
Ответы (3)
28
Tredor46, мой способ фиксит удаление мёртвых книг и прочих мёртвых предметов. А при удалении живых предметов утечка всё равно есть, см. сообщение IceFog выше.
7
PT153, Ну то есть никак эту утечку не пофиксить, ладно
Чтобы оставить комментарий, пожалуйста, войдите на сайт.