2009-07-12 25 views
6

Ok, ecco un problema che sto avendo.Lua binding a C++ e garbage collection

Ho collegamenti Lua a un motore di rendering che ha un gestore di rendering interno che mantiene la propria traccia di puntatori per la scena di rendering e li gestisce. Il problema è che quando lo uso da Lua, se non mantengo un riferimento Lua a ogni singolo oggetto che aggiungo al gestore di rendering C++, inizia a raccogliere i puntatori e naturalmente causa il crash. Non voglio particolarmente dover salvare ogni singolo riferimento per ogni singola cosa che creo. C'è un modo per costringere Lua a non raccogliere rifiuti certe cose? Ci sono altri modi in cui posso aggirare questo problema?

Sto generando gli attacchi Lua con SWIG.

risposta

9

Un modo semplice per impedire a Lua di garbage collection di un oggetto è di mettere quell'oggetto in una tabella (chiamarlo uncollectable) e quindi di inserire tale tabella nel registro Lua.

L'altra opzione è quella di utilizzare un livello aggiuntivo di riferimento indiretto con ogni oggetto Lua, cioè utilizzare "light userdata". La luce userdata punta a un puntatore all'oggetto C++ e, anche se viene raccolto il light userdata, l'oggetto sottostante rimane indenne.

Queste spiegazioni sono piuttosto concise, ma spero che con l'aiuto di Programming in Lua, sia possibile trasformarne uno in codice funzionante.