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