Jump to content

Проблемы с памятью на стороне клиента


Recommended Posts

Доброго времени суток, специально создал отдельную тему, т.к общался со многими компетентными(на мой взгляд) людьми, гуглил и никто так и не помог устранить проблемы.

Объясню по этапам. Появилась необходимость сделать кастомное GUI, делаю с помощью ООП(так называемого) используя либу: http://pastebin.com/RC1gN4Bs.

Сразу же прикреплю код: http://pastebin.com/2dQat3RK

Ниже суть проблемы вместе со скриншотами. Название ресурса - DxDrawing

1) Ресурс запущен, ничего не производилось, никаких действий.

http://i.imgur.com/06n0wz7.png

2) Создано 10000 объектов.

http://i.imgur.com/1iMutGF.png

3) Объекты удалены (по идее)

http://i.imgur.com/oxbWco4.png

Думаю видно, что занимаемая память на первом и последнем скринах не соответствует. Возможно я что-то делаю не так, возможно эта проблема глобальнее. Хотелось бы услышать адекватный ответ или же совет.

P.S. советы вроде "НЕ ИСПОЛЬЗУЙ ООП" попрошу в теме не оставлять.

Link to comment

Было бы неплохо, если бы вы посмотрели код внимательнее. Если в collectgarbage не использовать никакого аргумента, то он по стандарту использует "collect", внимание на строку 42 в коде.

Link to comment

Особо не вчитывался, но v:Destroy() может и выполняет какие-то действия, сам Lua объект/таблицу она удалить не может, соответственно таблица EditField все еще полна и коллектор не подберет то что в ней находится.

Распространенная ошибка когда скрипты сохраняют юзеров или какие еще элементы в глобальной таблице, юзеры уходят с сервера или элементы удаляются, а таблицу никто не чистит.

Link to comment

По сути после v:Destroy() в таблице EditField каждый элемент - nil (проверял, выводил), тобишь имеем таблицу, в которой 10000 элементов nil, но после вызова коллектора память не очищается.

Скрипт клиентский, ссылок на объекты, хранение в каких то других таблицах нет.

Link to comment

Да не работает так Lua. Объект не может обнулить/удалить сам себя, а соответственно и все ссылки на себя.

function CEditField:Destroy() 

это лишь короткая запись для

function CEditField.Destroy( self ) 

или

CEditField.Destroy = function ( self ) 

все эти записи будут работать абсолютно одинаково, соответственно self = nil это лишь обнуление локальной переменной, что не делает ровным счетом ничего.

self - не магия, а локальная переменная которая передается в функцию. Вот эти 2 записи тоже делают абсолютно одно и то же:

v:Destroy() 

CEditField.Destroy ( v ) 

Чисти таблицу.

В ней не могут быть значения nil: либо есть значение, либо его нет. А вот метаметоды __tostring и иже с ними могут запутать.

Для примера, если записать в таблицу игрока, когда он выйдет с сервера, он все еще останется в таблице и tostring все еще будет говорить что у нас на руках userdata, не смотря на то что МТА его удалила. Просто потому что невозможно удалить все ссылки на этого игрока удалив его самого.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...