2011-03-09 88 views
1

我有一些多次使用的lua腳本。每次我在腳本之間切換時,我都不想使用luaL_load。例如:緩存lua腳本


load script1 
run script1 
load script2 
run script2 
load script1 
run script1

我想保留一個引用或腳本1的東西,以便能夠在不加載它的情況下運行它。這可能嗎?我是lua的新手,也許這個問題很愚蠢......但對我來說似乎是一個很好的優化,以避免在經常使用腳本時加載腳本。我想上面的代碼中的東西被打開這樣的:

load script1 
load script2 

set current script script1 
run script1 
set current script script2 
run script2 
set current script script1 
run script1 

回答

6

嗯,你需要做的是保存編譯塊是luaL_loadfile推入堆棧。爲此,您可以使用lua_pushvalue(L,-1)在堆棧頂部創建已編譯塊的副本(因爲luaL_ref會彈出它)和int luaL_ref(L,LUA_REGISTRYINDEX)以在註冊表中獲取對其的引用。無論何時您需要大塊,您都可以使用lua_rawgeti(L,LUA_REGISTRYINDEX, refToChunk),這會將大塊推回到堆棧上,並準備好用於其中的lua_call

+0

看完這個之後,似乎refToChunk是對一些內部lua結構(編譯的塊)的引用。是否可以刪除這個內部結構?我想用它來釋放一塊完成後使用的內存 – Felics 2011-03-09 12:50:36

+0

當然,我會用'luaL_unref'完成。如果沒有其他對塊的引用,則GC在遇到它時將被刪除。你可能對[PiL的第17章](http://www.lua.org/pil/17.html)感興趣,關於弱表和垃圾回收。 – jpjacobs 2011-03-09 13:52:14

+0

謝謝!我會試試這個! – Felics 2011-03-09 14:06:42