2009-07-12 12 views
6

Ok, oto problem, który mam.Lua powiązania z C++ i zbieranie śmieci

Mam powiązania Lua z mechanizmem renderowania, który ma wewnętrznego menedżera renderowania, który zachowuje własną ścieżkę wskaźników dla sceny renderowania i zarządza nimi. Problem polega na tym, że gdy używam go od Lua, jeśli nie będę miał odniesienia do Lua do każdego pojedynczego obiektu dodanego do menedżera renderowania C++, zacznie on marnować kolekcjonowanie wskaźników i oczywiście powodować awarie. Nie chcę specjalnie zapisywać każdego odniesienia do każdej rzeczy, którą tworzę. Czy istnieje sposób, aby zmusić Luę, by nie zbierała śmieci na pewne rzeczy? Czy są jakieś inne sposoby na obejście tego problemu?

Generuję wiązania Lua za pomocą SWIG.

Odpowiedz

9

Prostym sposobem na uniknięcie luki w zbieraniu obiektów przez Lua jest umieszczenie tego obiektu w tabeli (wywołanie go uncollectable), a następnie umieszczenie tej tabeli w rejestrze Lua.

Inną opcją jest użycie dodatkowego poziomu niezależności od każdego obiektu Lua, tj. Użycie "light userdata". Lekka userdata wskazuje wskaźnik na obiekt C++, a nawet jeśli zbierane są lekkie dane użytkownika, ukryty obiekt pozostaje nietknięty.

Te wyjaśnienia są dość lakoniczne, ale mam nadzieję, że przy pomocy Programming in Lua, możesz zamienić jeden na działający kod.