public static LuaDiffInfo DeserializeDiff(BinaryReader br) { LuaDiffInfo diffInfo = LuaDiffInfo.Create(); int addCount = br.ReadInt32(); for (int i = 0; i < addCount; i++) { diffInfo.PushAddRef(ReadString(br), br.ReadInt32()); } int addDetailCount = br.ReadInt32(); for (int i = 0; i < addDetailCount; i++) { string key = ReadString(br); int count = br.ReadInt32(); for (int ii = 0; ii < count; ii++) { diffInfo.PushAddDetail(key, ReadString(br)); } } int rmCount = br.ReadInt32(); for (int i = 0; i < rmCount; i++) { diffInfo.PushRmRef(ReadString(br), br.ReadInt32()); } int rmDetailCount = br.ReadInt32(); for (int i = 0; i < rmDetailCount; i++) { string key = ReadString(br); int count = br.ReadInt32(); for (int ii = 0; ii < count; ii++) { diffInfo.PushRmDetail(key, ReadString(br)); } } int nullCount = br.ReadInt32(); for (int i = 0; i < nullCount; i++) { diffInfo.PushNullRef(ReadString(br), br.ReadInt32()); } int nullDetailCount = br.ReadInt32(); for (int i = 0; i < nullDetailCount; i++) { string key = ReadString(br); int count = br.ReadInt32(); for (int ii = 0; ii < count; ii++) { diffInfo.PushNullDetail(key, ReadString(br)); } } return(diffInfo); }
public static LuaDiffInfo Diff() { IntPtr L = LuaProfiler.mainL; if (L == IntPtr.Zero) { return(null); } isHook = false; Resources.UnloadUnusedAssets(); // 调用C# LuaTable LuaFunction WeakTable的析构 来清理掉lua的 ref GC.Collect(); // 清理掉C#强ref后,顺便清理掉很多弱引用 LuaDLL.lua_gc(L, LuaGCOptions.LUA_GCCOLLECT, 0); if (historyRef == -100) { Debug.LogError("has no history"); return(null); } int oldTop = LuaDLL.lua_gettop(L); LuaDLL.lua_getglobal(L, "miku_handle_error"); LuaDLL.lua_getglobal(L, "miku_diff"); LuaDLL.lua_getref(L, historyRef); if (LuaDLL.lua_type(L, -1) != LuaTypes.LUA_TTABLE) { Debug.LogError(LuaDLL.lua_type(L, -1)); LuaDLL.lua_settop(L, oldTop); historyRef = -100; return(null); } if (LuaDLL.lua_pcall(L, 1, 3, oldTop + 1) == 0) { LuaDLL.lua_remove(L, oldTop + 1); } int nullObjectRef = LuaDLL.luaL_ref(L, LuaIndexes.LUA_REGISTRYINDEX); int rmRef = LuaDLL.luaL_ref(L, LuaIndexes.LUA_REGISTRYINDEX); int addRef = LuaDLL.luaL_ref(L, LuaIndexes.LUA_REGISTRYINDEX); LuaDiffInfo ld = LuaDiffInfo.Create(); SetTable(nullObjectRef, ld.nullRef, ld.nullDetail); SetTable(rmRef, ld.rmRef, ld.rmDetail); SetTable(addRef, ld.addRef, ld.addDetail); LuaDLL.lua_unref(L, nullObjectRef); LuaDLL.lua_unref(L, rmRef); LuaDLL.lua_unref(L, addRef); LuaDLL.lua_settop(L, oldTop); isHook = true; return(ld); }
public static void Diff() { IntPtr L = LuaProfiler.mainL; if (L == IntPtr.Zero) { return; } isHook = false; if (historyRef == -100) { Debug.LogError("has no history"); return; } int oldTop = LuaDLL.lua_gettop(L); LuaDLL.lua_getglobal(L, "miku_handle_error"); LuaDLL.lua_getglobal(L, "miku_diff"); LuaDLL.lua_getref(L, historyRef); if (LuaDLL.lua_type(L, -1) != LuaTypes.LUA_TTABLE) { Debug.LogError(LuaDLL.lua_type(L, -1)); LuaDLL.lua_settop(L, oldTop); historyRef = -100; return; } if (LuaDLL.lua_pcall(L, 1, 3, oldTop + 1) == 0) { LuaDLL.lua_remove(L, oldTop + 1); } int nullObjectRef = LuaDLL.luaL_ref(L, LuaIndexes.LUA_REGISTRYINDEX); int rmRef = LuaDLL.luaL_ref(L, LuaIndexes.LUA_REGISTRYINDEX); int addRef = LuaDLL.luaL_ref(L, LuaIndexes.LUA_REGISTRYINDEX); LuaDiffInfo ld = LuaDiffInfo.Create(); SetNullObject(nullObjectRef, ld.nullRef); SetAddOrRm(rmRef, ld.rmRef, ld.rmDetail); SetAddOrRm(addRef, ld.addRef, ld.addDetail); NetWorkClient.SendMessage(ld); LuaDLL.lua_unref(L, nullObjectRef); LuaDLL.lua_unref(L, rmRef); LuaDLL.lua_unref(L, addRef); LuaDLL.lua_settop(L, oldTop); isHook = true; }
public static LuaDiffInfo Record() { IntPtr L = LuaProfiler.mainL; if (L == IntPtr.Zero) { return(null); } isHook = false; ClearRecord(); Resources.UnloadUnusedAssets(); // 调用C# LuaTable LuaFunction WeakTable的析构 来清理掉lua的 ref GC.Collect(); // 清理掉C#强ref后,顺便清理掉很多弱引用 LuaDLL.lua_gc(L, LuaGCOptions.LUA_GCCOLLECT, 0); int oldTop = LuaDLL.lua_gettop(L); LuaDLL.lua_getglobal(L, "miku_handle_error"); LuaDLL.lua_getglobal(L, "miku_do_record"); LuaDLL.lua_getglobal(L, "_G"); LuaDLL.lua_pushstring(L, ""); LuaDLL.lua_pushstring(L, "_G"); //recrod LuaDLL.lua_newtable(L); historyRef = LuaDLL.luaL_ref(L, LuaIndexes.LUA_REGISTRYINDEX); LuaDLL.lua_getref(L, historyRef); //history LuaDLL.lua_pushnil(L); //null_list LuaDLL.lua_newtable(L); LuaDLL.lua_pushvalue(L, -1); int nullObjectRef = LuaDLL.luaL_ref(L, LuaIndexes.LUA_REGISTRYINDEX); LuaDLL.lua_getref(L, staticHistoryRef); if (LuaDLL.lua_pcall(L, 7, 0, oldTop + 1) == 0) { LuaDLL.lua_remove(L, oldTop + 1); } LuaDLL.lua_settop(L, oldTop); oldTop = LuaDLL.lua_gettop(L); LuaDLL.lua_getglobal(L, "miku_handle_error"); LuaDLL.lua_getglobal(L, "miku_do_record"); LuaDLL.lua_pushvalue(L, LuaIndexes.LUA_REGISTRYINDEX); LuaDLL.lua_pushstring(L, ""); LuaDLL.lua_pushstring(L, "_R"); LuaDLL.lua_getref(L, historyRef); //history LuaDLL.lua_pushnil(L); //null_list LuaDLL.lua_getref(L, nullObjectRef); LuaDLL.lua_getref(L, staticHistoryRef); if (LuaDLL.lua_pcall(L, 7, 0, oldTop + 1) == 0) { LuaDLL.lua_remove(L, oldTop + 1); } LuaDLL.lua_settop(L, oldTop); LuaDiffInfo ld = LuaDiffInfo.Create(); SetTable(nullObjectRef, ld.nullRef, ld.nullDetail); LuaDLL.lua_unref(L, nullObjectRef); isHook = true; return(ld); }