2009-07-12 6 views
6

Ok, hier ist ein Problem, das ich habe.Lua Bindungen zu C++ und Müllsammlung

Ich habe Lua-Bindungen zu einer Rendering-Engine, die einen internen Render-Manager hat, der seine eigene Spur von Zeigern für die Render-Szene behält und verwaltet. Das Problem ist, dass wenn ich es von Lua verwende, wenn ich keine Lua-Referenz auf jedes einzelne Objekt, das ich dem C++ - Render-Manager hinzufüge, halte, fängt es an, die Zeiger zu sammeln und Dinge zum Absturz zu bringen. Ich möchte nicht jeden einzelnen Verweis auf jede einzelne Sache speichern müssen, die ich erstelle. Gibt es eine Möglichkeit, Lua zu zwingen, bestimmte Dinge nicht zu sammeln? Gibt es andere Möglichkeiten, um dieses Problem zu umgehen?

Ich erzeuge die Lua-Bindungen mit SWIG.

Antwort

9

Eine einfache Möglichkeit, Lua daran zu hindern, ein Objekt zu sammeln, besteht darin, dieses Objekt in eine Tabelle zu schreiben (uncollectable) und dann diese Tabelle in die Lua-Registry zu schreiben.

Ihre andere Option besteht darin, mit jedem Lua-Objekt eine zusätzliche Indirektionsebene zu verwenden, d. H. "Light userdata" zu verwenden. Die Light-Benutzerdaten verweisen auf einen Zeiger auf das C++ - Objekt, und selbst wenn die Light-Userdata gesammelt werden, bleibt das zugrunde liegende Objekt unversehrt.

Diese Erklärungen sind ziemlich knapp, aber ich hoffe, mit Hilfe von Programming in Lua können Sie einen in Arbeitscode verwandeln.