2009-07-12 2 views
6

좋아, 여기에 문제가있다.루아 바인딩 C++ 및 가비지 수집

렌더링 장면에 대한 포인터를 자체 추적하고 관리하는 내부 렌더링 관리자가있는 렌더링 엔진에 루아 바인딩이 있습니다. 문제는 내가 Lua에서 사용할 때, C++ 렌더링 관리자에 추가하는 모든 단일 객체에 대한 루아 참조를 유지하지 않는다면, 포인터를 가비지 수집하기 시작하고 물론 크래시가 발생하기 때문입니다. 특히 내가 만드는 모든 것에 대한 모든 단일 참조를 저장하지 않아도됩니다. 루아가 쓰레기를 모으지 않게하는 방법이 있습니까? 이 문제를 해결할 수있는 다른 방법이 있습니까?

나는 Lua 바인딩을 SWIG로 생성하고있다.

답변

9

Lua가 객체를 가비지 수집하지 못하게하는 간단한 방법은 객체를 테이블에 넣고 (uncollectable이라고 함) 해당 테이블을 Lua 레지스트리에 저장하는 것이다.

다른 옵션은 모든 Lua 객체에 추가 수준의 간접 참조를 사용하는 것입니다 (예 : 'light userdata'사용). light userdata는 C++ 객체에 대한 포인터를 가리키고 light userdata가 수집 되더라도 기본 객체는 상처가 남지 않습니다.

이 설명은 꽤 간결하지만, Programming in Lua의 도움을 받아 작업 코드로 만들 수 있습니다.