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