JavaScript游戏之优化篇


Posted in Javascript onNovember 08, 2010

1。善用DocumentFragment
之前有个打飞机的游戏。我是用如下方法添加子弹

for(var i=0;i<5;i++){ 
var bullet = new Bullet(); 
document.body.appendChild(bullet); 
}

问题就来了,我的目的是希望同时能出现5颗子弹,所以我循环将5个子弹对象添加到body,这样会导致一个结果:浏览器reflow了5次。
但其实可以找一个载体,来先把这5个子弹类装起来,然后,再一次性添加到body中,这样就只会出现一次flow。节省不少开销。
var df = document.createDocumentFragment(); 
for(var i=0;i<5;i++){ 
var bullet = new Bullet(); 
df.appendChild(bullet); 
} 
document.body.appendChild(df);

DocumentFragment:文档碎片,它不会产生任何标签,只是一个载体。

2。对引用值置空,Dom自定义的引用值也置空。
发觉自己写的代码,很多引用类型的值,都没有在变量结束的时候置空。
例如:

var Bullet = function(){ 
2 this.dom = null; 
3 this.init(); 
4 } 
5 Bullet.prototype = { 
6 this.init : function(){ 
7 this.dom = document.createElement('div'); 
8 document.body.appendChild(this.dom); 
9 } 
this.end : function(){ 
document.body.removeChild(this.dom); 
} 
}

在结束的时候单纯只是将dom对象移除,其实还需要将this.dom.innerHTML = ''以及this.dom = null。
只是针对IE系列,因为removeChild方法只是将dom元素从dom链中断开,没有释放对象。

3。使用getBoundingClientRect方法获取dom的left,top,width,height等参数。
当需要获取left,top,width,height等参数中两个或以上的时候,改用 getBoundingClientRect方法,可以一次性获取以上四个参数的一个对象,减少对
dom元素的属性访问。

var rect = document.getElementById('test').getBoundingClientRect(); 
//rect.width,rect.left,rect.top,rect.height

4。使用cloneNode方式克隆dom元素。
对于要需要经常性使用doucment.createElement方法来新建的dom元素,可以先将一个dom元素用cloneNode方法克隆保存起来,
下次需要再次使用的时候,可以直接用克隆的dom元素克隆一份出来,用cloneNode方法比用createElement方法速度要快。例子:
var temp; 
for(var i=0;i < 100;i++){ var dom = temp?temp.cloneNode():document.createElement('div'); 
if(!temp)temp = dom.cloneNode(); 
//do something 
}

5。循环判断中加标识,减少Dom属性判断。
根据游戏的逻辑,例如是男人就下一百层。
当小人站立在一个方块上面,这个时候,其它的方块,可以不需要再判断小人是否会掉落到自己的方块上,只需要往上升就行了。这样,一秒可以减少好几百次
对dom元素的属性访问,减少开销。当小人离开方块的时候,判断再次生效。合理利用。
附上自己写的:是男人就下100层传送门>>

暂时就发现那么多,以后发现更多的话,再写吧。。。
作者: cnblogs Floyd

Javascript 相关文章推荐
通过js来制作复选框的全选和不选效果
May 22 Javascript
javascript实现验证IP地址等相关信息代码
May 10 Javascript
javascript获取select值的方法分析
Jul 02 Javascript
原生js实现百叶窗效果及原理介绍
Apr 12 Javascript
js在ie下打开对话窗口的方法小结
Oct 24 Javascript
鼠标经过出现气泡框的简单实例
Mar 17 Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
Apr 30 Javascript
详解vue中使用protobuf踩坑记
May 07 Javascript
用webpack4开发小程序的实现方法
Jun 04 Javascript
js+html实现点名系统功能
Nov 05 Javascript
详解element上传组件before-remove钩子问题解决
Apr 08 Javascript
Javascript call及apply应用场景及实例
Aug 26 Javascript
javascript开发中因空格引发的错误
Nov 08 #Javascript
window.ActiveXObject使用说明
Nov 08 #Javascript
发布一个基于javascript的动画类 Fx.js
Nov 05 #Javascript
微博@符号的用户名提示效果。(想@到谁?)
Nov 05 #Javascript
js focus不起作用的解决方法(主要是因为dom元素是否加载完成)
Nov 05 #Javascript
细说浏览器特性检测(2)-通用事件检测
Nov 05 #Javascript
需要做特殊处理的DOM元素属性的访问
Nov 05 #Javascript
You might like
十天学会php(3)
2006/10/09 PHP
MySql数据库查询结果用表格输出PHP代码示例
2015/03/20 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
2015/10/16 PHP
CodeIgniter整合Smarty的方法详解
2017/08/25 PHP
php的对象传值与引用传值代码实例讲解
2021/02/26 PHP
use jscript with List Proxy Server Information
2007/06/11 Javascript
前台js对象在后台转化java对象的问题探讨
2013/12/20 Javascript
javascript实现获取浏览器版本、操作系统类型
2015/01/29 Javascript
javascript组合使用构造函数模式和原型模式实例
2015/06/04 Javascript
javascript实现延时显示提示框特效代码
2016/04/27 Javascript
JavaScript鼠标事件,点击鼠标右键,弹出div的简单实例
2016/08/03 Javascript
纯javaScript、jQuery实现个性化图片轮播【推荐】
2017/01/08 Javascript
w3c编程挑战_初级脚本算法实战篇
2017/06/23 Javascript
JS设计模式之数据访问对象模式的实例讲解
2017/09/30 Javascript
详谈构造函数加括号与不加括号的区别
2017/10/26 Javascript
Vue组件开发之LeanCloud带图形校验码的短信发送功能
2017/11/07 Javascript
对vue中v-on绑定自定事件的实例讲解
2018/09/06 Javascript
在vue中解决提示警告 for循环报错的方法
2018/09/28 Javascript
浅析vue-cli3配置webpack-bundle-analyzer插件【推荐】
2019/10/23 Javascript
javascript实现拖拽碰撞检测
2020/03/12 Javascript
Node.js API详解之 net模块实例分析
2020/05/18 Javascript
使用vue编写h5公众号跳转小程序的实现代码
2020/11/27 Vue.js
[03:57]《不朽》——2015DOTA2国际邀请赛—中国军团出征主题曲MV
2015/07/15 DOTA
Windows下python2.7.8安装图文教程
2016/05/26 Python
python按修改时间顺序排列文件的实例代码
2019/07/25 Python
基础的CSS3弹性盒Flexbox布局使用实例
2016/04/08 HTML / CSS
太阳镜仓库,售价20美元或更少:Sunglass Warehouse
2016/09/28 全球购物
意大利折扣和优惠券网站:Groupalia
2019/10/09 全球购物
什么是聚集索引和非聚集索引
2012/01/17 面试题
小学生检讨书大全
2014/02/06 职场文书
小学教师师德师风个人整改措施
2014/09/18 职场文书
公司党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
基层党员干部四风问题整改方向和措施
2014/09/25 职场文书
八年级语文教学反思
2016/03/03 职场文书
Python入门之基础语法详解
2021/05/11 Python
Mysql官方性能测试工具mysqlslap的使用简介
2021/05/21 MySQL