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 相关文章推荐
打造基于jQuery的高性能TreeView(asp.net)
Feb 23 Javascript
基于jQuery的弹出框插件
Mar 18 Javascript
js通过iframe加载外部网页的实现代码
Apr 05 Javascript
js操作DOM--添加、删除节点的简单实例
Jul 08 Javascript
jQuery 全选 全部选 反选 实现代码
Aug 17 Javascript
vue.js学习笔记之绑定style样式和class列表
Oct 31 Javascript
详解Vue.js动态绑定class
Dec 20 Javascript
javascript数据结构中栈的应用之符号平衡问题
Apr 11 Javascript
AngularJS的$location使用方法详解
Oct 19 Javascript
javascript计算对象长度的方法
Oct 25 Javascript
vue配置请求本地json数据的方法
Apr 11 Javascript
VUE搭建手机商城心得和遇到的坑
Feb 21 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
基于mysql的bbs设计(五)
2006/10/09 PHP
php 阴历-农历-转换类代码
2012/01/16 PHP
PHP下的Oracle客户端扩展(OCI8)安装教程
2014/09/10 PHP
Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法
2016/03/29 PHP
JavaScript语法着色引擎(demo及打包文件下载)
2007/06/13 Javascript
js 新浪的一个图片播放图片轮换效果代码
2008/07/15 Javascript
js 面向对象的技术创建高级 Web 应用程序
2010/02/25 Javascript
javascript中的if语句使用介绍
2013/11/20 Javascript
jquery.mobile 共同布局遇到的问题小结
2015/02/10 Javascript
JavaScript与java语言有什么不同
2016/09/22 Javascript
bootstrap模态框远程示例代码分享
2017/05/22 Javascript
vue项目部署到Apache服务器中遇到的问题解决
2018/08/24 Javascript
vue-cli整合vuex的时候,修改actions和mutations,实现热部署的方法
2018/09/19 Javascript
JS实现使用POST方式发送请求
2019/08/30 Javascript
js实现选项卡效果
2020/03/07 Javascript
Selenium执行JavaScript脚本的方法示例
2020/12/31 Javascript
使用Python中的tkinter模块作图的方法
2017/02/07 Python
详解Python 装饰器执行顺序迷思
2018/08/08 Python
将python图片转为二进制文本的实例
2019/01/24 Python
python集合的创建、添加及删除操作示例
2019/10/08 Python
PyTorch加载预训练模型实例(pretrained)
2020/01/17 Python
使用canvas压缩图片大小的方法示例
2019/08/02 HTML / CSS
什么是数组名
2012/05/10 面试题
初一英语教学反思
2014/01/11 职场文书
初二政治教学反思
2014/01/12 职场文书
交通事故检查书范文
2014/01/30 职场文书
2014学习全国两会精神心得体会2000字
2014/03/11 职场文书
令人印象深刻的自荐信
2014/05/25 职场文书
学校百日安全生产活动总结
2014/07/05 职场文书
校庆团日活动总结
2014/08/28 职场文书
2014年幼儿园国庆主题活动方案
2014/09/16 职场文书
群众路线教育实践活动民主生活会个人检查对照思想汇报
2014/10/04 职场文书
西安大雁塔导游词
2015/02/10 职场文书
医院党建工作总结2015
2015/05/26 职场文书
浅谈vue2的$refs在vue3组合式API中的替代方法
2021/04/18 Vue.js
python实现进度条的多种实现
2021/04/29 Python