关于内存:
在创建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自动回收
网友评论