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 统计时间
Mar 09 Javascript
JavaScript 类似flash效果的立体图片浏览器
Feb 08 Javascript
jQuery asp.net 用json格式返回自定义对象
Apr 07 Javascript
js String对象中常用方法小结(字符串操作)
Jan 27 Javascript
javascript使用中为什么10..toString()正常而10.toString()出错呢
Jan 11 Javascript
event对象获取方法总结在google浏览器下测试
Nov 03 Javascript
Node.js的特点和应用场景介绍
Nov 04 Javascript
[原创]JQuery 在表单提交之前修改 提交的值
Apr 14 Javascript
浅谈JavaScript的push(),pop(),concat()方法
Jun 03 Javascript
纯前端JavaScript实现Excel IO案例分享
Aug 26 Javascript
jQuery实现的事件绑定功能基本示例
Oct 11 jQuery
如何基于JS截获动态代码
Dec 25 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
Ajax+PHP 边学边练之四 表单
2009/11/27 PHP
PHP中usort在值相同时改变原始位置问题的解决方法
2011/11/27 PHP
深入理解:单一入口、MVC、ORM、CURD、ActiveRecord概念
2013/06/06 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
2014/11/19 PHP
php实现构建排除当前元素的乘积数组方法
2018/10/06 PHP
redis+php实现微博(二)发布与关注功能详解
2019/09/23 PHP
jscript之List Excel Color Values
2007/06/13 Javascript
JavaScript使表单中的内容显示在屏幕上的方法
2015/06/29 Javascript
JavaScript 正则表达式中global模式的特性
2016/02/25 Javascript
一起学写js Calender日历控件
2016/04/14 Javascript
ES6学习笔记之Set和Map数据结构详解
2017/04/07 Javascript
webpack vue项目开发环境局域网访问方法
2018/03/20 Javascript
vue里面v-bind和Props 利用props绑定动态数据的方法
2018/08/27 Javascript
使用vue自定义指令开发表单验证插件validate.js
2019/05/23 Javascript
原生js+ajax分页组件
2020/01/30 Javascript
[44:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第二局
2016/03/03 DOTA
在Python中操作字典之update()方法的使用
2015/05/22 Python
微信跳一跳小游戏python脚本
2018/01/05 Python
python3之模块psutil系统性能信息使用
2018/05/30 Python
python3中利用filter函数输出小于某个数的所有回文数实例
2019/11/24 Python
django queryset 去重 .distinct()说明
2020/05/19 Python
python温度转换华氏温度实现代码
2020/12/06 Python
HTML5之web workers_动力节点Java学院整理
2017/07/17 HTML / CSS
AmazeUi Tree(树形结构) 应用小结
2020/08/17 HTML / CSS
Unix/Linux开发面试题
2016/08/16 面试题
大学生护理专业自荐信
2013/10/03 职场文书
乡镇平安建设汇报材料
2014/08/25 职场文书
校长四风对照检查材料
2014/09/27 职场文书
企业年检委托书范本
2014/10/14 职场文书
商铺门面租房协议书
2014/10/21 职场文书
酒店辞职书怎么写
2015/02/26 职场文书
总经理助理岗位职责范本
2015/03/31 职场文书
mysql创建存储过程及函数详解
2021/12/04 MySQL
Python的三个重要函数详解
2022/01/18 Python
CDPR谈《巫师》新作用虚幻5原因 称不会为Epic独占
2022/04/06 其他游戏
解决MySQL报“too many connections“错误
2022/04/19 MySQL