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下高效拼装字符串的几种方法比较与测试代码
Apr 15 Javascript
jQuery使用empty()方法删除元素及其所有子元素的方法
Mar 26 Javascript
JavaScript操作class和style样式代码详解
Feb 13 Javascript
Node.js中如何合并两个复杂对象详解
Dec 31 Javascript
bootstrap datetimepicker日期插件超详细使用方法介绍
Feb 23 Javascript
关于foreach循环中遇到的问题小结
May 08 Javascript
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
Jul 05 jQuery
jquery.validate.js 多个相同name的处理方式
Jul 10 jQuery
jQuery实现模拟搜索引擎的智能提示功能简单示例
Jan 27 jQuery
vue中使用rem布局代码详解
Oct 30 Javascript
Vue实现简单计算器案例
Feb 25 Javascript
微信小程序反编译的实现
Dec 10 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中对2个数组相加的函数
2011/06/24 PHP
浅析51个PHP处理字符串的函数
2013/08/02 PHP
ThinkPHP登录功能的实现方法
2014/08/20 PHP
PHP的cURL库简介及使用示例
2015/02/06 PHP
php遍历树的常用方法汇总
2015/06/18 PHP
详解php语言最牛掰的Laravel框架
2017/11/20 PHP
Aster vs KG BO3 第三场2.18
2021/03/10 DOTA
基本jquery的控制tabs打开的数量的代码
2010/10/17 Javascript
DIY jquery plugin - tabs标签切换实现代码
2010/12/11 Javascript
Jquery post传递数组方法实现思路及代码
2013/04/28 Javascript
用js控制组织结构图可以任意拖拽到指定位置
2014/01/17 Javascript
Javascript仿PHP $_GET获取URL中的参数
2014/05/12 Javascript
javascript实现博客园页面右下角返回顶部按钮
2015/02/22 Javascript
JavaScript微信定位功能实现方法
2016/11/29 Javascript
JS常见DOM节点操作示例【创建 ,插入,删除,复制,查找】
2018/05/14 Javascript
axios取消请求的实践记录分享
2018/09/26 Javascript
一些你可能不熟悉的JS知识点总结
2019/03/15 Javascript
Vue编程式跳转的实例代码详解
2019/07/10 Javascript
JS如何实现网站中PC端和手机端自动识别并跳转对应的代码
2020/01/08 Javascript
[00:23]DOTA2群星共贺开放测试 25日无码时代来袭
2013/09/23 DOTA
Python学习笔记之os模块使用总结
2014/11/03 Python
python提取内容关键词的方法
2015/03/16 Python
python实现批量改文件名称的方法
2015/05/25 Python
python中zip和unzip数据的方法
2015/05/27 Python
python2.7 json 转换日期的处理的示例
2018/03/07 Python
Python人脸识别第三方库face_recognition接口说明文档
2019/05/03 Python
Python中remove漏删和索引越界问题的解决
2020/03/18 Python
在tensorflow以及keras安装目录查询操作(windows下)
2020/06/19 Python
python map比for循环快在哪
2020/09/21 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
2020/09/28 Python
HTML5去掉输入框type为number时的上下箭头的实现方法
2020/01/03 HTML / CSS
巴西食品补充剂在线零售商:Músculos na Web
2017/08/07 全球购物
英国时尚泳装品牌:Maru Swimwear
2019/10/06 全球购物
sealed修饰符是干什么的
2012/10/23 面试题
孔庙导游词
2015/02/04 职场文书
警用民用对讲机找不同
2022/02/18 无线电