luaEnv调用Dispose的时候偶尔会出现无法释放问题
我是游戏切换账号时,退出重登切换场景到CleanScene调用的dispose, 在此之前也做了清理引用和GC的操作了,但多次切换后,偶尔会出现dispose失败的报错, 打印未释放的信息都是lua里Instantiate的某个对象, 出现try to dispose a LuaEnv with C# callback!后再玩会游戏就会崩溃了。
于是,我做了对全部对象调用xlua.release,延迟一会调用dispose,把dispose调用放在两层嵌套的函数里调用等等操作。 但都行不通,大概4,5次切换后还是会出现dipose失败的报错。而且未释放的都是lua里调用的Instantiate。 后来发现是切换场景后luaBase的析构函数未调用。 实在想不通,也找不到解决办法,想请教一下
@chexiongsheng
在C#端把所有引用lua的function和table的地方全部设为null,最后延迟调用luaenv的Dispose
在C#端把所有引用lua的function和table的地方全部设为null,最后延迟调用luaenv的Dispose
这个操作也做了。几次调用Dispose都是没问题的,但偶尔还是会出现报错。打印的未释放的堆栈却是lua里加载对象池时调用的Instantiate。 @WilsomLi
首先先网上找一些debug xlua引用的参考,把Lua和c#堆栈都存一下,看看释放的时候是哪些堆栈注册的;如果确实引用都释放了,c#层都置空了,有可能是gc的机制问题,我们项目遇到一个问题,在mono模式下一切正常,但是在IL2CPP模式下,c#gc一次后还有c#对象没被释放,在LuaEnv.cs的Dispose()里把gc多加一次就好了。 FullGc(); System.GC.Collect(); System.GC.WaitForPendingFinalizers(); //在IL2CPP模式下,需要多调用一次gc才能真正回收所有对象 System.GC.Collect(); System.GC.WaitForPendingFinalizers(); Dispose(true);
System.GC.Collect(); System.GC.WaitForPendingFinalizers();
看到释放的时候打印的堆栈就是lua这边调用的Instantiate函数。。我还做了等待5s的清理过程,用协程每隔1秒调用。可最后还是没用。。依旧在几次重登后会报错 for(int i = 0; i < 5; i++) { if (!LuaBehaviour.luaEnv.AllDelegateBridgeReleased()) { LuaBehaviour.luaEnv.FullGc(); System.GC.Collect(); System.GC.WaitForPendingFinalizers(); yield return new WaitForSeconds(1); UnityEngine.Debug.Log("未释放完成,等待中.."); } } try{ LuaBehaviour.luaEnv.Dispose(); }catch(Exception e) { Debug.LogError("try to dispose a LuaEnv with C# callback!"); }
@mxj1024