XLua 避免反射帶來的GC 和耗時(shí) 優(yōu)化

xlua 原理就是通過生成wrap代碼盼砍,在運(yùn)行時(shí)調(diào)用。
但在實(shí)際調(diào)試過程中逝她,還是會有很多的反射代碼被生成浇坐。
因此添加一個(gè)日志輸出,可以看到哪些類型是沒有被生成wrap黔宛,而lua中又用到了近刘。

        public bool TryDelayWrapLoader(RealStatePtr L, Type type)
        {
            if (loaded_types.ContainsKey(type)) return true;
            loaded_types.Add(type, true);

            LuaAPI.luaL_newmetatable(L, type.FullName); //先建一個(gè)metatable,因?yàn)榧虞d過程可能會需要用到
            LuaAPI.lua_pop(L, 1);

            Action<RealStatePtr> loader;
            int top = LuaAPI.lua_gettop(L);
            if (delayWrap.TryGetValue(type, out loader))
            {
                delayWrap.Remove(type);
                loader(L);
            }
            else
            {
#if !GEN_CODE_MINIMIZE && !ENABLE_IL2CPP && (UNITY_EDITOR || XLUA_GENERAL) && !FORCE_REFLECTION && !NET_STANDARD_2_0
                if (!DelegateBridge.Gen_Flag && !type.IsEnum() && !typeof(Delegate).IsAssignableFrom(type) && Utils.IsPublic(type))
                {
                    Type wrap = ce.EmitTypeWrap(type);
                    MethodInfo method = wrap.GetMethod("__Register", BindingFlags.Static | BindingFlags.Public);
                    method.Invoke(null, new object[] { L });
                }
                else
                {
                    // 此處添加日志輸出臀晃,可以看到在生成wrap代碼后觉渴,還有哪些type在被反射生成
                    Debug.Log("<color=green>jayden:ObjectTranslator.TryDelayWrapLoader:" + type + "</color>");
                    Utils.ReflectionWrap(L, type, privateAccessibleFlags.Contains(type));
                }
#else
                Utils.ReflectionWrap(L, type, privateAccessibleFlags.Contains(type));
#endif
  // 以下代碼省略

通過日志可以總結(jié)出一些規(guī)律:

1.class 中又定義了class、enum等類型

這種寫法积仗,在xlua的配置中GenConfig疆拘,通過命名空間方法添加的列表中,是無法生成warp類的寂曹。

盡量拆分代碼文件哎迄,且放在命名空間下,即符合編碼規(guī)范隆圆,也能減少配置項(xiàng)漱挚。

2.自定義的delegate 委托

public delegate void OnMapChanged();
public OnMapChanged EventOnMapChanged;

如果沒有添加到GenConfig 的委托列表中,那么也會在運(yùn)行時(shí)被反射添加渺氧。

這種情況應(yīng)該盡量使用Action,Func旨涝,這種會在生成代碼的時(shí)候,被合并侣背。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末白华,一起剝皮案震驚了整個(gè)濱河市慨默,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌弧腥,老刑警劉巖厦取,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異管搪,居然都是意外死亡虾攻,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門更鲁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來霎箍,“玉大人,你說我怎么就攤上這事澡为∑担” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵缀壤,是天一觀的道長樊拓。 經(jīng)常有香客問我纠亚,道長塘慕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任蒂胞,我火速辦了婚禮图呢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘骗随。我一直安慰自己蛤织,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布鸿染。 她就那樣靜靜地躺著指蚜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涨椒。 梳的紋絲不亂的頭發(fā)上摊鸡,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機(jī)與錄音蚕冬,去河邊找鬼免猾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛囤热,可吹牛的內(nèi)容都是我干的猎提。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼旁蔼,長吁一口氣:“原來是場噩夢啊……” “哼锨苏!你這毒婦竟也來了疙教?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤伞租,失蹤者是張志新(化名)和其女友劉穎松逊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肯夏,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡经宏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驯击。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烁兰。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖徊都,靈堂內(nèi)的尸體忽然破棺而出沪斟,到底是詐尸還是另有隱情,我是刑警寧澤暇矫,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布主之,位于F島的核電站,受9級特大地震影響李根,放射性物質(zhì)發(fā)生泄漏槽奕。R本人自食惡果不足惜禀忆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一承璃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尖坤,春花似錦囱持、人聲如沸夯接。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盔几。三九已至,卻和暖如春掩幢,著一層夾襖步出監(jiān)牢的瞬間逊拍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工粒蜈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留顺献,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓枯怖,卻偏偏與公主長得像注整,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345