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í)被反射添加渺氧。