ugui-tolua
ugui tolua
local test = {}
test.b = gameobject test.c = gameobject:GetComponent(typeof(UnityEngine.UI.Button))
首先调用UnityEngine.GameObject.Destroy(test.b) 如果test这个table也被ToLuaUnRef回收之后,发现 test.c这个引用c#中的Button对象并未从ObjectTranslator.objectsBackMap中释放出来
ObjectTranslator.objectsBackMap中的释放是经过gc也就是
public static int Collect(IntPtr L)
{
int udata = LuaDLL.tolua_rawnetobj(L, 1);
if (udata != -1)
{
ObjectTranslator translator = GetTranslator(L);
translator.RemoveObject(udata);
}
return 0;
}
void RemoveObject(object o, int udata)
{
int index = -1;
if (objectsBackMap.TryGetValue(o, out index) && index == udata)
{
objectsBackMap.Remove(o);
}
}
请问大家是怎么做处理的?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
这个测试用例可否发到问答网站上?这样我们也可以下来研究一下,找找原因。
test不是lua table吗?跟ToLuaUnRef有什么关系?
要Collect也是UserData(Button对象)走Collect。
先看看lua里面有没有开自动GC,或者手动GC。没有的话,UserData的元方法__gc也是调用不到的。
还有个前提就是test已经成为了垃圾,或者手动设置test.c=nil。
是存在的呢。就是因为在项目中出现这个情况,我才写了这个精简的测试用例就行测试的呢。
ObjectTranslator中的对象没有释放,应该是你Lua中还引用这这个对象。正常的做法是,保证Lua中的引用及时释放,但是这样会有很多xxx=nil的代码,如果项目开始不注意这些,后期改起来会很烦。
我们是在切场景的时候,筛一边ObjectTranslator里缓存的对象,把已经Destroy的处理掉。
大佬,我用百度云分享出来了,有空看下~~ https://pan.baidu.com/s/1ZsmGwFiDT9pVHDfLpSdoOQ
在真机上测试一下,看看问题是否还存在。