原文:http://doc.ulua.org/article/faq/zenmeyouhuadaochuwrapdehanshus.html
注册Wrap文件到Lua虚拟机中,有很多的优化方式,比如:
(1)BinderLua太多wrap很慢,最佳方案。(早先)
推荐大家把可能用到的类,不要直接添加进Wrap,而是添加到link.xml中,如果上线用到了,可以先用反射垫着,整包更新的时候,再添加到wrap里面,这是目前兼顾游戏体验,防范游戏未知问题,最佳选择方案。
(2)动态注册Wrap文件到Lua虚拟机。
(3)还有从导出类过滤文件大小。
之前都是从架构级别、文件注册顺序方面来优化的,第三种优化方案是从函数类,来优化生成wrap文件的大小,如果这部分减少了,注册的数量照样会得到提升:
我们打开Assets\uLua\Source\Base\ToLuaExport.cs文件,找到下面的一行:
public static List memberFilter = new List
里面已经有不少因为不同平台API不能导出到Wrap的函数等,当然了,你也可以加入自己的“万年不用”的函数进去,当下次导出Wrap的时候,它就不在导出函数的Wrap文件里面了,也就一定程度提升了加载的效率。请一定记好。
(4)优化思想:因为Unity使用的托管语言c#,ulua用的是原生c语言,c#函数调用c函数走的是P/Invoke方式,明显的效率没法与c与lua的组合相比,根据云风大神说法,既然避免不了,那就尽量减少c#调用lua的次数来做主题优化思想。另外:lua调用c#比c#调用lua效率要高,大家自己做相应的优化策略。
(5)尽最多可能使用lua中的容器table取代c#中的所有容器,因为lua的table是c语言实现,效率比c#最快的容器Dictionary还要快,千万别舍快求慢。
(6)ulua、框架自带的例子CallLuaFunction_02里面都附带了no gc alloc调用方式,如果需要在每一帧里面c#都要调用lua中的函数,切记要用no gc alloc,如果调用不多的直接用CallLuaFunction即可。清理lua虚拟机的内存使用LuaScripgMgr.LuaGC函数。
(7)推荐多线程加载assetbundle,纹理异步贴图,把同步的压力分解开,来优化UI的滚动列表。
(8)取消动态参数:打开LuaFunction.cs文件,找到下面的函数声明:
/*
* Calls the function and returns its return values inside
* an array
*/
public object[] Call(params object[] args)
{
return call(args, null);
}
想办法取消动态参数args,可用较笨方法,就是定义6-7个默认参数,不够再加。
(9)安卓平台如果使用luajit的话,记得在lua最开始执行的地方请开启 jit.off(),性能会提升N倍。
(10)记得安卓平台上在加上jit.opt.start(3),相当于c++程序-O3,可选范围0-3,性能还会提升。