lua菜鸟问下一下lua跟宿主之间重入的问题以及脚本装载的问题
lua吧
全部回复
仅看楼主
level 2
Stephenmax 楼主
1.重入的问题
假设宿主程序调用lua脚本,然后lua脚本中调用了宿主程序的函数,该宿主程序中又调用了着一个或另外的lua脚本。
这种情况下,是不是只要每个压栈匹配一个退栈来使退回上层函数前恢复到上层函数的栈状态,即便用同一个lua state也是可以的是吗?还是为了避免重入每次宿主调用脚本都必须用不同的lua state?
以及这个问题相关的一个问题,lua的栈大小是自动增长的吗。还是必须手动调用lua_checkstack来自行确保剩余的栈空间?
2.脚本装载的问题
假设宿主程序性能敏感,我用luajit,我有一批脚本,宿主会频繁调用脚本,我想避免每次装载脚本时的开销,是不是我只要提前编译成字节码脚本,然后启动宿主时一次性的把所有脚本文件读入内存,每次用脚本时只要lua_loadbuffer就可以了?
在脚本已编译成字节码的情况下,执行lua_loadbuffer是不是非常快了?
还是需要其他办法,比如宿主程序启动时,一次性的把所有脚本全都读到栈上来?
谢谢大家
2014年09月23日 02点09分 1
level 8
1:一个state就可以了。lua的栈不会自动增长,但会预留足够的空间(貌似是20,忘记了),如果压栈元素太多,可以用lua_checkstack来保证有足够的空间。
2:最好能在启动时一次性把所有脚本加载完。
2014年09月23日 09点09分 2
level 2
Stephenmax 楼主
多谢楼上。
“最好能在启动时一次性把所有脚本加载完”
能否具体说下呢,谢谢~
是指启动时所有脚本全装载到栈上去吗?如果是这样,假设每个脚本都有个OnHited函数,我要调用a.lua的OnHited如何区分是调用哪个呢
2014年09月23日 09点09分 3
level 2
Stephenmax 楼主
接上,lua中全局变量或函数有没有作用域的概念?
比如,a.lua中有个test函数,b.lua中也有个test函数
能否通过类似于a.test,b.test之类的方式区分它们?
2014年09月23日 10点09分 4
是域,不是作用域,说错了
2014年09月23日 10点09分
lua有模块的概念,每个文件可以当作一个模块,模块之间是独立的,通过require来访问。
2014年09月24日 01点09分
回复 ks_isaf :多谢,我去研究下
2014年09月24日 03点09分
回复 ks_isaf :如果我理解的没错的话,我把每个脚本写成一个模块就能解决我的问题。他们是不同的模块,即便各自有同名全局函数也不会互相影响到全局命名空间。宿主调用lua模块中的函数,就像这个人做的那样: http://john.nachtimwald.com/2014/07/26/calling-lua-from-c/
2014年09月24日 09点09分
level 2
Stephenmax 楼主
如果我通过lua_loadbuffer或lua_loadfile把一批脚本一次性的装载到了栈上。
每个脚本中都有同名全局函数OnHited。
我可否认为装载到栈上后,每个脚本都是个表?想要执行某脚本中的OnHited函数,只要通过lua_getfield(l, 脚本在栈上的索引, *OnHited*),即可将该脚本的OnHited函数放到栈顶,然后我就可以lua_pcall了?
如果这些OnHited函数都是local的话可以吗?
2014年09月23日 10点09分 5
直接加载多个脚本的话,它们都是在同一个环境中的。不过你可以将不同的脚本在不同的环境中加载,这样就可以区分了。local变量不能直接访问。
2014年09月24日 01点09分
回复 ks_isaf :我看到local变量可以通过debug相关的接口访问,想必通过这种方式不是一个高效的常规方式。既然直接加载都是在同一个环境中,同名的全局函数看来也没法区分。如果脚本有500个,创建500个lua环境我觉得也是蛮恐怖。我还是继续熟悉下lua之后再想吧。不知道其他的游戏脚本引擎是如何管理的。
2014年09月24日 03点09分
1