js引擎garbage collection的问题
2016-02-02 23:34
751 查看
最近做一个Cocos2d-js的游戏,因为对性能要求比较高,而且运算量比较大,才发现了js的堆内存回收问题很严重。
例如每隔几秒钟(比较稳定的频率),就会出现一次卡顿。
关于这个问题的解决,也就只能通过内存池的方式来解决了。例如,cc.p这个方法,每次调用都会产生一个新Object对象,因为要大量的计算位置信息,尤其是当游戏元素涉及到上百个甚至上千的时候,每一帧需要开辟出来的Object不在少数。
由于在我的代码中,大量的cc.p产生的对象都是临时的(也就是产生的值在赋值后就抛弃了),因此可以通过如下的方式来缓解这个问题。
将cc.p替换成pool.p就可以了。
关于两个Pool的交替,原来我是打算在每次update的时候交换一次。但后来觉得,只要设置一个足够大的SWAP_THRESHOLD,可以省下更多的内存。
当然,这个方法还是有些风险的,只有在对自己的代码很有把握的时候才能使用。真正安全的方法,当然还是通过get和push的方式来管理Pool。
由于在我的游戏中,涉及到成千的对象生成和消灭,所以就连一个Object的生成和遗弃,都要做优化。这个就需要用安全的对象池来管理了。
例如每隔几秒钟(比较稳定的频率),就会出现一次卡顿。
关于这个问题的解决,也就只能通过内存池的方式来解决了。例如,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的生成和遗弃,都要做优化。这个就需要用安全的对象池来管理了。
相关文章推荐
- JavaScript模块化与esl.js
- Dom及JavaScript图片库
- 个人笔记 js 15 js字符串的转换
- 个人笔记 js 14 js实现点击单元格行跳转链接到指定页面
- extjs查找表单中的文本框值
- 个人笔记 js 13 点击事件触发弹窗询问选项
- [转]FastJSON通过SerializeFilter定制序列化
- #学习笔记#(30)牛客网JS测试题21~45
- js调试工具Console命令详解
- 如何实现JSP网页模板 JSP网页母版
- javascript异步过程
- BZOJ 1013: [JSOI2008]球形空间产生器sphere
- JSTL不同版本和EL表达式的关联
- 如何在JavaScript里取session的值
- 什么是javaScript闭包
- JavaScript基础笔记集合
- 立即执行函数表达式 项目经常用到js 代码Module模式
- 不学就吃亏的underscorejs类库学习示例 ——(集合篇)
- Ajax经典总结
- ace布置小作业: 制作一个简单的电话号码归属地查询软件:JSON解析和Volly发送get请求