public static void DoString(IntPtr L, string script) { LuaHook.isHook = false; byte[] chunk = Encoding.UTF8.GetBytes(script); int oldTop = LuaDLL.lua_gettop(L); LuaDLL.lua_getglobal(L, "miku_handle_error"); if (LuaDLL.luaL_loadbuffer(L, chunk, (IntPtr)chunk.Length, "chunk") == 0) { if (LuaDLL.lua_pcall(L, 0, -1, oldTop + 1) == 0) { LuaDLL.lua_remove(L, oldTop + 1); } } else { Debug.Log(script); } LuaHook.isHook = true; LuaDLL.lua_settop(L, oldTop); }
public static string GetRefString(IntPtr L, int index) { IntPtr len; IntPtr intPtr = LuaDLL.lua_tolstring(L, index, out len); object text; if (!TryGetLuaString(intPtr, out text)) { string tmpText = LuaDLL.lua_tostring(L, index); if (!string.IsNullOrEmpty(tmpText)) { text = string.Intern(tmpText); } else { text = "nil"; } RefString(intPtr, index, text, L); } return((string)text); }
public static void __Register(IntPtr L) { LuaDLL.lua_newtable(L); LuaDLL.lua_pushstring(L, "LuaProfiler"); LuaDLL.lua_newtable(L); LuaDLL.lua_pushstring(L, "BeginSample"); LuaDLL.lua_pushstdcallcfunction(L, beginSample); LuaDLL.lua_rawset(L, -3); LuaDLL.lua_pushstring(L, "EndSample"); LuaDLL.lua_pushstdcallcfunction(L, endSample); LuaDLL.lua_rawset(L, -3); LuaDLL.lua_rawset(L, -3); LuaDLL.lua_setglobal(L, "MikuLuaProfiler"); LuaDLL.lua_pushstdcallcfunction(L, unpackReturnValue); LuaDLL.lua_setglobal(L, "miku_unpack_return_value"); LuaDLL.lua_pushstdcallcfunction(L, addRefFunInfo); LuaDLL.lua_setglobal(L, "miku_add_ref_fun_info"); LuaDLL.lua_pushstdcallcfunction(L, removeRefFunInfo); LuaDLL.lua_setglobal(L, "miku_remove_ref_fun_info"); LuaDLL.lua_pushstdcallcfunction(L, checkType); LuaDLL.lua_setglobal(L, "miku_check_type"); LuaDLL.lua_pushstdcallcfunction(L, handleError); LuaDLL.lua_setglobal(L, "miku_handle_error"); LuaDLL.lua_newtable(L); LuaDLL.lua_setglobal(L, "MikuLuaProfilerStrTb"); LuaLib.DoString(L, get_ref_string); LuaLib.DoString(L, null_script); LuaLib.DoString(L, diff_script); }
public static void OnStartGame() { #if UNITY_EDITOR if (!Application.isPlaying) { return; } #endif if (isInite) { return; } isInite = true; setting = LuaDeepProfilerSetting.MakeInstance(); LuaProfiler.mainThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId; if (setting.isNeedCapture) { Screen.SetResolution(480, 270, true); } #if UNITY_EDITOR if (setting.isDeepLuaProfiler) { LuaDLL.Install(); } #endif if (setting.isDeepLuaProfiler || setting.isDeepMonoProfiler || setting.isCleanMode) { GameObject go = new GameObject(); go.name = "MikuLuaProfiler"; go.hideFlags = HideFlags.HideAndDontSave; DontDestroyOnLoad(go); go.AddComponent <HookLuaSetup>(); NetWorkClient.ConnectServer(setting.ip, setting.port); } }
static int UnpackReturnValue(IntPtr L) { LuaProfiler.EndSample(L); return(LuaDLL.lua_gettop(L)); }
public static void Record() { IntPtr L = LuaProfiler.mainL; if (L == IntPtr.Zero) { return; } 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); if (LuaDLL.lua_pcall(L, 6, 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_newtable(L); if (LuaDLL.lua_pcall(L, 6, 0, oldTop + 1) == 0) { LuaDLL.lua_remove(L, oldTop + 1); } LuaDLL.lua_settop(L, oldTop); isHook = true; }