2011-03-09 58 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