您的位置:首页 > Web前端 > JavaScript

js引擎garbage collection的问题

2016-02-02 23:34 751 查看
最近做一个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的生成和遗弃,都要做优化。这个就需要用安全的对象池来管理了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: