_ME

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

原文: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,性能还会提升。

posted on 2018-04-13 10:18  小白_ME  阅读(2323)  评论(0编辑  收藏  举报