背景
项目是全Lua开发,导致的其中一个结果是会遇到lua的gc性能问题。而且相对于C#这种强类型语言,Lua因为其自由性,对于团队后期维护还是有一定的成本,不做好代码复审,相对不好维护。这个时候就需要我们自主了解Lua和C#交互的底层逻辑和实现原理,用以之后在lua测开发的时候做出良好的代码优化。
项目采用xlua结构与c#端进行交互,在个别地方和其他类型的lua(比如和tolua的加载机制)不一样,但lua底层都是一致的。在此次分享中会有一些知识专属于xlua范围。
Lua和C#交互逻辑
Lua文件加载
xLua定义了两种在C#中调用lua代码的方式:
-
DoString("xxxxxxxxxxxx").这个函数一般不建议使用,LuaEnv中就有此段代码:


这段代码内部主要定义了在Lua中访问c#对象时进行的具体操作。这里具体干了什么事情,还需要留待未来探讨。
-
自定义loader来加载文件。
通过调用LuaEnv中的AddLoader注册回调,这样每当lua脚本中调用require函数时,都会将参数传回给回调。如果这个回调返回null,则证明loader找不到相应的lua脚本,否则返回lua脚本的内容。
有了这种加载方式,则方便处理热更新下来的lua文件,或者是加密的文件,在回调中进行相应的操作即可。参考代码如下:
LuaEnv luaenv = new LuaEnv(); luaenv.AddLoader(MyLoader);
上述两种方式中,用自定义loader的一个好处就是,文件即便是已经加密也可以自己写loader读取文件解密后返回即可。
Lua和C#如何互相调用方法、对象(浅层)
xlua定义了独有的调用方式。在程序员层面上,我们只需要在c#代码某处加上LuaCallCSharp就可以在lua端调用代码。
[CSharpCallLua] public static List csharpCallLuaList = new List
{
typeof(System.Func),
typeof(System.Action),
typeof(System.Action