как ужиться со сборщиком мусора Lua ?
От: Troglodit  
Дата: 03.10.08 22:37
Оценка:
Есть у меня Lua скриптец работающий в связке с С++ (через mLuabind) который получает вначале менеджер спрайтов, затем этим менеджером создает кучу спрайтов и устанавливает их в нужную позицию. При создании спрайтов менеджером они вносятся в массив и там хранятся.


    obj = {}  
    StaticSpriteManager=getMgr();  
      
    for v = 1, 4000, 1 do   
      local obj= StaticSpriteManager.createStaticSprite();  
      obj.setPosition(400,300);  
    end



Проблемма в том что эти спрайты начинают сразу же удаляться, еще до завершения работы скрипта.
Как я понимаю это происходит потому, что в obj прописался новый спрайт, а прежний потерял все ссылки
(вот прежний и удаляется).

Вопрос — нормальное ли это поведение Луа (может у меня что-то заглючило)
иесли да то как с этим мириться? Тоесть в данной ситуации мне вовсе не надо чтобы спрайты удалялись,
и может быть вообще ситуация когда я решу готовый массив спрайтов подвигать скриптом, так что они там тоже удалятся?
Это же никуда не годится.

Помогите плиз разрулить.

11.12.08 22:34: Перенесено модератором из 'Прочее' — der Igel
lua сборщик мусора garbage
Re: как ужиться со сборщиком мусора Lua ?
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 04.10.08 08:33
Оценка: +1
Здравствуйте, Troglodit, Вы писали:

T>Помогите плиз разрулить.


Не очень понимаю, что ты делаешь. StaticSpriteManager.createStaticSprite() создаёт новый спрайт? Тогда вполне нормально, что он удаляется.
Может, тебе надо заполнить спрайтами массив obj = {}? Тогда зачаем делается присвоение local obj= StaticSpriteManager.createStaticSprite();?
Делай obj[v] = StaticSpriteManager.createStaticSprite();
Re[2]: как ужиться со сборщиком мусора Lua ?
От: Troglodit  
Дата: 04.10.08 10:18
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>Не очень понимаю, что ты делаешь. StaticSpriteManager.createStaticSprite() создаёт новый спрайт? Тогда вполне нормально, что он удаляется.

N>Может, тебе надо заполнить спрайтами массив obj = {}? Тогда зачаем делается присвоение local obj= StaticSpriteManager.createStaticSprite();?
N>Делай obj[v] = StaticSpriteManager.createStaticSprite();

Да, пример кода не очень удачный , я приведу другой — обойти все спрайты (созданные не в луа) и выставить им координаты (400,300)


 StaticSpriteManager=getMgr();  
   
 for v = 1, 4000, 1 do   
   local obj= StaticSpriteManager.getStaticSprite(v);  
   obj.setPosition(400,300);  
 end



здесь оно тоже все удаляет, хоть не оно создавало. Как поступить ?

я понял, что можно в глобальной таблице сохранять все что обрабатываем и не хотим чтобы это удалилось, но это же как-то не правильно, этот набор объектов я мог создать и не скриптом, а скриптом просто обработать единажды. И мне получается для того чтобы после этой единственной обработки объектов скриптом он их не поудалял нужно делать лишние телодвижения и загонять их в глобальный массив. Разве это удобно ?
Re[3]: как ужиться со сборщиком мусора Lua ?
От: migun Великобритания https://magnumbytes.com/
Дата: 05.10.08 11:27
Оценка:
Здравствуйте, Troglodit, Вы писали:


T>Да, пример кода не очень удачный , я приведу другой — обойти все спрайты (созданные не в луа) и выставить им координаты (400,300)


T>
T> StaticSpriteManager=getMgr();  
   
T> for v = 1, 4000, 1 do   
T>   local obj= StaticSpriteManager.getStaticSprite(v);  
T>   obj.setPosition(400,300);  
T> end  
T>



T>здесь оно тоже все удаляет, хоть не оно создавало. Как поступить ?


А можно увидеть код биндинга на стороне C++? Как будто объекты передаются по значению, либо отдается ownership через adopt.
Re[4]: как ужиться со сборщиком мусора Lua ?
От: Troglodit  
Дата: 06.10.08 09:34
Оценка:
Здравствуйте, migun, Вы писали:

M>Здравствуйте, Troglodit, Вы писали:



T>>Да, пример кода не очень удачный , я приведу другой — обойти все спрайты (созданные не в луа) и выставить им координаты (400,300)


T>>
T>> StaticSpriteManager=getMgr();  
   
T>> for v = 1, 4000, 1 do   
T>>   local obj= StaticSpriteManager.getStaticSprite(v);  
T>>   obj.setPosition(400,300);  
T>> end  
T>>



T>>здесь оно тоже все удаляет, хоть не оно создавало. Как поступить ?


M>А можно увидеть код биндинга на стороне C++? Как будто объекты передаются по значению, либо отдается ownership через adopt.



        host.Insert(
            Class<hwStaticSprite>("hwStaticSprite")
            .Constructor()
            .Method("setPosition", &hwStaticSprite::setPosition)
            .Member("dx", &hwStaticSprite::dx)
            .Member("dy", &hwStaticSprite::dy)
            .Member("scale", &hwStaticSprite::scale)
            .Member("rot", &hwStaticSprite::rot)
            .Member("dscale", &hwStaticSprite::dscale)
            .Member("drot", &hwStaticSprite::drot)
            );

        host.Insert( Function("getMgr", &getMgr ) );

        host.Insert(
            Class<hwStaticSpriteManager>("hwStaticSpriteManager")
            .Method("createStaticSprite", &hwStaticSpriteManager::createStaticSprite, Adopt(-1))
            .Method("getStaticSprite", &hwStaticSpriteManager::getStaticSprite, Adopt(-1))
            );



Да, действидельно, когда убрал адопт удалять перестало. Спасибо !
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.