Slua内存管理

作者: 慢慢来比较快_ | 来源:发表于2018-03-02 16:50 被阅读0次

    关于内存:

    在创建C#对象push到lua前,slua都会把对象存放到ObjectCache,引用着,防止被释放。

    举个栗子说明:

    创建一个Gameobject A,然后给A增加一个Image组件,Image绑定一张Texture2D B,那么马上Destroy A,即便执行了C#的内存回收,也不会回收掉纹理B的内存。因为ObjectCache依旧引用着纹理B,但是ObjectCache中A和它的组件会置为null。

    这时,需要执行lua的collectgarbage, 才能把纹理B从Cache里去除,从而把内存降下来。

    简单来说,你在lua中操作过的每一个对象都会记录在ObjectCache里(组件也是对象),当你Destroy后,ObjectCache的记录会为null(这是C#做的,Dictionary中key为弱引用),但是你Destroy对象,不代表能把内存清理干净,例如上面栗子中的纹理B,它在lua中被创建出来,是需要执行lua的GC,才能把B清理掉。

    还有切场景,切场景会主动释放场景中的对象,这里是C#进行的,不管lua有没引用着(所以还是会出现类似"野指针"的问题)

    至于<不在场景>中的对象会不会自动释放 ? 我还需要测试下,个人推测是受lua引用影响的,所以如果创建了纹理之类的资源,不要用全局变量引用,而是用local,然后就等待切场景时GC自动回收

    相关文章

      网友评论

        本文标题:Slua内存管理

        本文链接:https://www.haomeiwen.com/subject/fqcxtftx.html