2.2.1内存释放机制,友情提示

公司的上线产品,考虑从2.1.4升级到2.2.1,昨天尝试了一个通宵,发现一些变化

1、以往2.1.4引擎使用时,我们对序列帧的资源做了资源池的控制,每6秒资源会自己看看有没有被用到,如果没有被用到,则自己会释放。伴随着JS虚拟机每20~30秒的GC,内存是动态的在变化的。

2、切换到2.2.1时,我们发现GC的机制改变了:

当任意使用 new 的方式创建的 Node 在某个 sences 中使用过时(比如battle sences)。切换到其他的 sences 后不会动态释放(比如从战斗切换回主城)。若想在其他sences中释放资源,可以手动呼唤GC。

GC方法:cc.sys.garbageCollect()

PS:GC消耗很大,切勿频繁呼唤

1赞

从 2.2.0 开始,我们强化了内存管理机制,现在要求用户通过代码动态创建且独立于场景节点树的 cc.Node 必须通过 destroy() 释放,否则引擎无法知道何时回收这类节点的内存,会导致内存泄露。
此外,手动从场景中移除的节点,在不需要用到的时候也需要统一 destroy。如果通过 cc.NodePool 管理节点,则不受影响:
// 假设 testNode 是场景中的某个节点,若之前被手动移出场景了,如
testNode.parent = null;
// 或者
testNode.removeFromParent(true);
// 或者
parentNode.removeChild(testNode);
// 若往后 testNode 还会再次用到,则无需手动 destroy 该节点
// 否则应该手动调用
testNode.destroy();

已检查过这个问题,确认node已经destroy了,也和引擎组的沟通过了。最终结果还是要手动CALL GC

通过New 创建的node,添加在场景某个节点上,就不需要手动调destroy()了吗?
但是切换场景的时候,资源释放还是很迷,勾选了自动释放内存还是不减少,

跳转场景,加上手动释放
var oldAsset = cc.director.getScene().dependAssets;
cc.loader.release(oldAsset);

还是感觉很迷

cc.sys.garbageCollect() 用了就要卡一两秒三四秒

这个内存回收对H5生效吗?还是说只能在原生端?

只对原生有效

微信用wx.triggerGC();

哈哈哈,就是这个情况,但是呼唤了GC,还是能释放掉的。除了卡之外,没啥特别的~~