js引擎garbage collection的问题

最近做一个Cocos2d-js的游戏,因为对性能要求比较高,而且运算量比较大,才发现了js的堆内存回收问题很严重。

例如每隔几秒钟(比较稳定的频率),就会出现一次卡顿。

关于这个问题的解决,也就只能通过内存池的方式来解决了。例如,cc.p这个方法,每次调用都会产生一个新Object对象,因为要大量的计算位置信息,尤其是当游戏元素涉及到上百个甚至上千的时候,每一帧需要开辟出来的Object不在少数。

由于在我的代码中,大量的cc.p产生的对象都是临时的(也就是产生的值在赋值后就抛弃了),因此可以通过如下的方式来缓解这个问题。

var CCPPool = [];
var USEDCCPPool = [];
var SWAP_THRESHOLD = 100;
pool.p = function(x, y){
    if(CCPPool.length > 0){
        var p = CCPPool.shift();
        p.x = x;
        p.y = y;
    }else{
        var p = {x:x, y:y};
    }
    USEDCCPPool.push(p);
    if(USEDCCPPool.length > SWAP_THRESHOLD){
        var pool = CCPPool;
        CCPPool = USEDCCPPool;
        USEDCCPPool = pool;
    }
    return p;
}

将cc.p替换成pool.p就可以了。

关于两个Pool的交替,原来我是打算在每次update的时候交换一次。但后来觉得,只要设置一个足够大的SWAP_THRESHOLD,可以省下更多的内存。

当然,这个方法还是有些风险的,只有在对自己的代码很有把握的时候才能使用。真正安全的方法,当然还是通过get和push的方式来管理Pool。

由于在我的游戏中,涉及到成千的对象生成和消灭,所以就连一个Object的生成和遗弃,都要做优化。这个就需要用安全的对象池来管理了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值