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实现随机数生成算法示例代码
Aug 08 Javascript
js 3种归并操作的实例代码
Oct 30 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
Dec 09 Javascript
ES6中Math对象的部分扩展
Feb 20 Javascript
protractor的安装与基本使用教程
Jul 07 Javascript
JS对象序列化成json数据和json数据转化为JS对象的代码
Aug 23 Javascript
three.js实现3D模型展示的示例代码
Dec 31 Javascript
angular 服务的单例模式(依赖注入模式下)详解
Oct 22 Javascript
微信小程序页面间值传递的两种方法
Nov 26 Javascript
vue中如何实现后台管理系统的权限控制的方法步骤
Sep 05 Javascript
js实现带箭头的进度流程
Mar 26 Javascript
JavaScript 中for/of,for/in 的详细介绍
Nov 17 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
德生S2000收音机更换“钕铁硼”全频扬声器
2021/03/02 无线电
php mysql数据库操作类
2008/06/04 PHP
PHP explode()函数用法、切分字符串
2012/10/03 PHP
Jquery 设置标题的自动翻转
2009/10/03 Javascript
跨域传值即主页面与iframe之间互相传值
2013/12/09 Javascript
JS使用ajax方法获取指定url的head信息中指定字段值的方法
2015/03/24 Javascript
全面解析Bootstrap表单使用方法(表单控件状态)
2015/11/24 Javascript
ES6记录异步函数的执行时间详解
2016/08/31 Javascript
Jquery AJAX POST与GET之间的区别详细介绍
2016/10/17 Javascript
js 数据存储和DOM编程
2017/02/09 Javascript
详解vue服务端渲染(SSR)初探
2017/06/19 Javascript
JS限制输入框输入的实现代码
2018/07/02 Javascript
[01:14]DOTA2 7.22版本新增神杖效果展示(智力英雄篇)
2019/05/29 DOTA
[01:12:08]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.24
2019/09/10 DOTA
python处理中文编码和判断编码示例
2014/02/26 Python
使用基于Python的Tornado框架的HTTP客户端的教程
2015/04/24 Python
Python判断某个用户对某个文件的权限
2016/10/13 Python
PyQt5每天必学之布局管理
2018/04/19 Python
transform python环境快速配置方法
2018/09/27 Python
Django框架模板介绍
2019/01/15 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
2019/02/16 Python
解决python flask中config配置管理的问题
2019/07/26 Python
python hash每次调用结果不同的原因
2019/11/21 Python
python时间time模块处理大全
2020/10/25 Python
Python WebSocket长连接心跳与短连接的示例
2020/11/24 Python
使用css如何制作时间ICON方法实践
2012/11/12 HTML / CSS
会计电算化专业毕业生推荐信
2013/12/24 职场文书
车辆转让协议书
2014/09/24 职场文书
致800米运动员广播稿(10篇)
2014/10/17 职场文书
幼师辞职信怎么写
2015/02/27 职场文书
Python实现简单的猜单词
2021/06/15 Python
Java8 CompletableFuture 异步回调
2022/04/28 Java/Android
科学家研发出新型速效酶,可在 24 小时内降解塑料制品
2022/04/29 数码科技
python+opencv实现目标跟踪过程
2022/06/21 Python
Nginx跨域问题解析与解决
2022/08/05 Servers
使用CSS实现按钮边缘跑马灯动画
2023/05/07 HTML / CSS