unity + lua 性能優化 1.0


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM