Lua сборка мусора и C userdata - PullRequest
       1

Lua сборка мусора и C userdata

3 голосов
/ 09 февраля 2011

В моем игровом движке я открываю объекты Vector и Color для Lua, используя userdata.

Теперь, для каждого даже локально созданного Vector и Color из сценариев Lua, использование памяти Luas немного увеличивается, оно не падает, пока не будет запущен сборщик мусора.

Сборщик мусора вызывает небольшую задержку в моей игре.

Разве объекты Vector и Color не должны быть немедленно удалены, если они используются только в качестве аргументов? Например, как: myObject:SetPosition( Vector( 123,456 ) )

Сейчас это не так - использование памяти Lua увеличивается до 1,5 МБ каждую секунду, затем происходит скачок задержки, и он возвращается примерно к 50 КБ.

  • Как я могу решить эту проблему, это даже решаемо?

Ответы [ 4 ]

2 голосов
/ 09 февраля 2011

В Lua единственный способ удаления таких объектов, как userdata, - сборщик мусора. Вы можете вызвать сборщик мусора напрямую, как писал Б. Митч (используйте lua_gc(L, LUA_CGSTEP, ...)), но нет гарантии, что именно ваш временный объект будет освобожден.

Лучший способ решить эту проблему - избегать создания временных объектов. Если вам нужно передать фиксированные параметры таким методам, как SetPosition, попробуйте изменить API, чтобы он также принимал числовые аргументы, избегая создания временного объекта, например:

myObject:SetPosition(123, 456)
2 голосов
/ 09 февраля 2011

Вы можете запустить lua_setgcthreshold(L,0) для принудительного немедленного сбора мусора после выхода из функции.

Редактировать: для 5.1 я вижу следующее:

int lua_gc (lua_State *L, int what, int data);

Controls the garbage collector.

This function performs several tasks, according to the value of the parameter what:

    * LUA_GCSTOP: stops the garbage collector.
    * LUA_GCRESTART: restarts the garbage collector.
    * LUA_GCCOLLECT: performs a full garbage-collection cycle.
    * LUA_GCCOUNT: returns the current amount of memory (in Kbytes) in use by Lua.
    * LUA_GCCOUNTB: returns the remainder of dividing the current amount of bytes of memory in use by Lua by 1024.
    * LUA_GCSTEP: performs an incremental step of garbage collection. The step "size" is controlled by data (larger values mean more steps) in a non-specified way. If you want to control the step size you must experimentally tune the value of data. The function returns 1 if the step finished a garbage-collection cycle.
    * LUA_GCSETPAUSE: sets data as the new value for the pause of the collector (see §2.10). The function returns the previous value of the pause.
    * LUA_GCSETSTEPMUL: sets data as the new value for the step multiplier of the collector (see §2.10). The function returns the previous value of the step multiplier.
1 голос
/ 09 февраля 2011

Lua Gems содержит полезную информацию об оптимизации для программ Lua.

0 голосов
/ 09 февраля 2011

Помните, Lua не знает до времени выполнения, сохранили ли вы эти объекты или нет - вы могли бы, например, поместить их в таблицу в реестре. Вы даже не должны замечать воздействия сбора 1,5 МБ, здесь есть еще одна проблема.

Кроме того, вы действительно тратите впустую создание нового объекта для этого. Помните, что в Lua каждый объект должен быть распределен динамически, поэтому вы вызываете malloc, чтобы ... сделать объект Vector для хранения двух чисел? Напишите вашу функцию, чтобы она принимала пару числовых аргументов в качестве перегрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...