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 相关文章推荐
关于JavaScript的一些看法
May 27 Javascript
在IE下获取object(ActiveX)的Param的代码
Sep 15 Javascript
Javascript 面向对象 继承
May 13 Javascript
Jquery实现鼠标移上弹出提示框、移出消失思路及代码
May 19 Javascript
用Javascript获取页面元素的具体位置
Dec 09 Javascript
JS小游戏之宇宙战机源码详解
Sep 25 Javascript
使用jQuery判断Div是否在可视区域的方法 判断div是否可见
Feb 17 Javascript
EasyUI在Panel上动态添加LinkButton按钮
Aug 11 Javascript
javascript将url解析为json格式的两种方法
Aug 18 Javascript
使用webpack打包koa2 框架app
Feb 02 Javascript
详解vue表单——小白速看
Apr 08 Javascript
详解Vue 多级组件透传新方法provide/inject
May 09 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 变量的定义方法
2010/01/26 PHP
《PHP编程最快明白》第三讲:php数组
2010/11/01 PHP
php实现在线生成条形码示例分享(条形码生成器)
2013/12/30 PHP
php中数字0和空值的区别分析
2014/06/05 PHP
ThinkPHP实现带验证码的文件上传功能实例
2014/11/01 PHP
PHP实现算式验证码和汉字验证码实例
2015/03/09 PHP
微信开发之php表单微信中自动提交两次问题解决办法
2017/01/08 PHP
ThinkPHP框架结合Ajax实现用户名校验功能示例
2019/07/03 PHP
JavaScript中令你抓狂的魔术变量
2006/11/30 Javascript
用JavaScript对JSON进行模式匹配(Part 1-设计)
2010/07/17 Javascript
jquery+ajax每秒向后台发送请求数据然后返回页面的代码
2011/01/17 Javascript
js实现通用的微信分享组件示例
2014/03/10 Javascript
Nodejs学习笔记之Stream模块
2015/01/13 NodeJs
jquery插件validation实现验证身份证号等
2015/06/04 Javascript
JS+CSS实现精美的二级导航效果代码
2015/09/17 Javascript
第二章之Bootstrap 页面排版样式
2016/04/25 Javascript
从零开始学习Node.js系列教程四:多页面实现数学运算的client端和server端示例
2017/04/13 Javascript
利用Ionic2 + angular4实现一个地区选择组件
2017/07/27 Javascript
js+html实现点名系统功能
2019/11/05 Javascript
微信小程序实现modal弹出框遮罩层组件(可带文本框)
2020/12/20 Javascript
python使用xslt提取网页数据的方法
2018/02/23 Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
2019/01/17 Python
Python中asyncio模块的深入讲解
2019/06/10 Python
python使用装饰器作日志处理的方法
2019/07/11 Python
Python 仅获取响应头, 不获取实体的实例
2019/08/21 Python
python运用sklearn实现KNN分类算法
2019/10/16 Python
python自动识别文本编码格式代码
2019/12/26 Python
python文件操作seek()偏移量,读取指正到指定位置操作
2020/07/05 Python
详解python UDP 编程
2020/08/24 Python
python字典按照value排序方法
2020/12/28 Python
教师自荐信
2013/12/10 职场文书
初中学校军训方案
2014/05/09 职场文书
销售员岗位职责
2015/02/10 职场文书
幼儿园教师个人工作总结2015
2015/05/12 职场文书
关于军训的感想
2015/08/07 职场文书
使用Oracle命令进行数据库备份与还原
2021/12/06 Oracle