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获取数组最大和最小值示例代码
Oct 29 Javascript
Jquery仿IGoogle实现可拖动窗口示例代码
Aug 22 Javascript
javascript使用正则表达式检测IP地址
Dec 03 Javascript
浅谈JavaScript for循环 闭包
Jun 22 Javascript
AngularJS实现数据列表的增加、删除和上移下移等功能实例
Sep 05 Javascript
js+html制作简单验证码
Feb 16 Javascript
本地存储localStorage用法详解
Jul 31 Javascript
React组件内事件传参实现tab切换的示例代码
Jul 04 Javascript
微信小程序搭建(mpvue+mpvue-weui+fly.js)的详细步骤
Sep 18 Javascript
如何使用three.js 制作一个三维的推箱子游戏
Jul 29 Javascript
JavaScript this关键字指向常用情况解析
Sep 02 Javascript
解决vue与node模版引擎的渲染标记{{}}(双花括号)冲突问题
Sep 11 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
使用Appcan客户端自动更新PHP版本号(全)
2015/07/31 PHP
php 无限级分类 获取顶级分类ID
2016/03/13 PHP
php获得文件夹下所有文件的递归算法的简单实例
2016/11/01 PHP
用Javascript做flash做的事..才完成的一个类.Auntion Action var 0.1
2007/02/23 Javascript
javascript实现动态增加删除表格行(兼容IE/FF)
2007/04/02 Javascript
关于取不到由location.href提交而来的上级页面地址的解决办法
2009/07/30 Javascript
动态加载脚本提升javascript性能
2014/02/24 Javascript
Jquery插件分享之气泡形提示控件grumble.js
2014/05/20 Javascript
Bootstrap每天必学之警告框插件
2016/04/26 Javascript
全面了解函数声明与函数表达式、变量提升
2016/08/09 Javascript
JavaScript中的高级函数
2018/01/04 Javascript
基于bootstrap页面渲染的问题解决方法
2018/08/09 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
2019/05/02 Javascript
详解小程序横屏方案对比
2020/06/28 Javascript
[02:21]十步杀一人,千里不留行——DOTA2全新英雄天涯墨客展示
2018/08/29 DOTA
python的dict,set,list,tuple应用详解
2014/07/24 Python
Python中字典(dict)合并的四种方法总结
2017/08/10 Python
python批量下载网站马拉松照片的完整步骤
2018/12/05 Python
Python+OpenCV采集本地摄像头的视频
2019/04/25 Python
Python调用接口合并Excel表代码实例
2020/03/31 Python
Python pandas如何向excel添加数据
2020/05/22 Python
CSS3中使用RGBA设置透明度的示例
2015/08/04 HTML / CSS
京东国际站:JOYBUY
2017/11/23 全球购物
中科方德软件测试面试题
2016/04/21 面试题
幼师自荐信
2013/10/26 职场文书
大学生找工作推荐信范文
2013/11/28 职场文书
数控专业大学毕业生职业规划范文
2014/02/06 职场文书
一年级语文教学反思
2014/02/13 职场文书
高三家长寄语
2014/04/03 职场文书
《富饶的西沙群岛》教学反思
2014/04/09 职场文书
《春晓》教学反思
2014/04/20 职场文书
新疆民族团结演讲稿
2014/08/27 职场文书
OpenCV-Python实现轮廓的特征值
2021/06/09 Python
教你修复 Win11应用商店加载空白问题
2021/12/06 数码科技
浅谈MySQL中的六种日志
2022/03/23 MySQL
Java中API的使用方法详情
2022/04/06 Java/Android