ugui-tolua

发布于 2017-01-31 07:35:38 字数 919 浏览 1399 评论 6

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

泛泛之交 2019-03-13 02:40:50

这个测试用例可否发到问答网站上?这样我们也可以下来研究一下,找找原因。

泛泛之交 2019-03-11 15:58:27

test不是lua table吗?跟ToLuaUnRef有什么关系?
要Collect也是UserData(Button对象)走Collect。
先看看lua里面有没有开自动GC,或者手动GC。没有的话,UserData的元方法__gc也是调用不到的。
还有个前提就是test已经成为了垃圾,或者手动设置test.c=nil。

晚风撩人 2018-12-10 19:51:59

是存在的呢。就是因为在项目中出现这个情况,我才写了这个精简的测试用例就行测试的呢。

甜柠檬 2018-06-07 22:24:00

ObjectTranslator中的对象没有释放,应该是你Lua中还引用这这个对象。正常的做法是,保证Lua中的引用及时释放,但是这样会有很多xxx=nil的代码,如果项目开始不注意这些,后期改起来会很烦。
我们是在切场景的时候,筛一边ObjectTranslator里缓存的对象,把已经Destroy的处理掉。

归属感 2017-10-18 13:07:43

大佬,我用百度云分享出来了,有空看下~~ https://pan.baidu.com/s/1ZsmGwFiDT9pVHDfLpSdoOQ

想挽留 2017-07-05 20:15:36

在真机上测试一下,看看问题是否还存在。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文