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