Loader的冻结,flash player 9采用unload就行冻结,flash player10引入了一个新的方法
unloadAndStop()
进行冻结,该方法会卸载SWF文件,自动冻结SWF中的每个显示对象并强制运行垃圾回收。
关于MovieClip和Sprite的鼠标事件,当不需要鼠标事件的时候将 mouseEnabled 和 mouseChildren 设为false. 不断的检测鼠标交互事件会消耗CPU,尤其是大量交互对象重叠的情况。
对于执行时间太长的非动画内容,优先选择计时器,而不是 Event.ENTER_FRAME 事件。
var obj:Object = {}; 比
var obj:Object = new Object(); 好
var arr:Array = []; 比
var arr:Array = new Array(); 好
* 循环测试1000,0000次 ,
[]比new快3倍
for (var i:int=0, len=arr.length; i<len; i++) 比 (头一次看到这种写法
经测试 效率是下面的2倍
)
for (var i:int=0; i<arr.length; i++) 好
if (myObj != null) 比
if (myObj) 快
for ( var i:* in myObj ) 比
for ( var i:String in myObj ) 快;
如果不是为了保存颜色值请不要适用uint这个类型,他的速度比起 int要慢多了;
Array的遍历要比Object或者Dictionary的枚举要快得多。
Dictionary当 weak key设置为 true 的时候要比 false 慢;
var myText:String = “a” + “b” + “c”;
var myText2:String = [ "a", "b", "c" ].join(”");
在JavaScript里面在IE下后者要更快,但是在AS里面,前者更快!
在循环体内声明变量和在循环体外声明变量其实速度上不会有太大的区别。
4、小心Flash的重绘
如果你使用的是Flash Player 的Debugger版本,那么请在检查性能瓶颈的时候不要忘记打开显示重绘区域的功能,这将帮你迅速定位到舞台上有那些地方被重绘了,找出没有显示任何东西却不断重绘的地方,这些地方肯定是有问题的。Flash Player很笨,不会说你把一个DisplayObject的visible设置成false就放弃重绘那个显示对象。所以请保证你的 MovieClip在visible=false的时候为停止状态。有一点很有意思,假设两个现实物体存在 hitTest = true 这样的关系,那么重绘的区域的面积很有可能 > 两者的面积总和!
小心使用useBitmapCache = true
一般情况下除非你确定这个显示对象不可能发生变化那么用用也无妨,不过我更推荐自己手动的用BitmapData将该对象Draw一遍,然后让这个对象彻底消失。否则每次的变动都是巨大的性能消耗。
5. 乘法运算 比 除法 快 “两” 倍:
x=(stage.stageWidth/2);与x=(stage.stageWidth*0.5);的结果是一样的,但是乘法的运算效率要比除法快两倍(测试为真)。
6.
避免频繁的创建和删除对象动作:对于要从舞台中删除的对象,如果稍后还会再用到这个对象的话,使用visibility=false将其“删除”,而不是使用removeChild把它从显示列表中删除。因为Flash Player中重建对象要比隐藏对象复杂的多。
7.使用对象池:在游戏初始化时,把所有需要的对象存放到一个数组中。当需要删除和重建对象是,只需要声明一个对象引用数组中的这个对象即可。这比重新new一个对象出来要快多了。
8
.
位运算有时候会更快:位运算的计算方法和CPU的处理数据本质上是一致的,跟CPU讲它的“母语”,它“理解”起来,做起来自然就更快了!
9.使用Vector类存储一组相同类型的数据:Flash player10引入了Vector类。除了要求存储数据必须是同一种类型外,它的功能和Array类完全一致。但是如果当需要存储不同类型的数据时,Array的运行效率还要比Vector胜出一筹的。
10.
用uint代替Math.floor:要对一个小数进行四舍五入,你第一时间可能会想到Math.floor方法,比如 Math.floor(9.3213);而将这个数字强制转换为uint类型,可以得到相同个结果:uint(9.3213);更重要的是Flash Player处理uint的速度要比Math.floor快的多。
11. 使用适当的Display Object
o Shape – 没有交互(占内存少)
o Sprite – 有交互(占内存多)
o MovieClip – 有时间线(占内存更多)
* 尽可能重用对象,而不要重新创建
* 强制类型转换int(exp)要比Math.floor()和Math.ceil()快很多
* 使用对象池技术重用对象
* 释放内存 – 将所有对象的引用设置为null
* 尽可能重用BitmapData
* Callback要比event快而且消耗更少的内存
2. 减少CPU使用率
* 即便将一个 Display Object从stage上移除了(removeChild)甚至是已经将它的引用设置为null,它依然有可能在消耗CPU。所以要在其移出 display list时将其完全停下来(比如mc.stop())。
* 卸载从外部装载的内容时,使用loader.unloadAndStop(),而不要使用loader.unload()。
* 尽可能禁用鼠标交互。obj.mouseEnabled = false; obj.mouseChildren = false;
* Timer在某些情况下比ENTER_FRAME要好。
* 减少tweening的使用。
3. ActionScript性能
尽可能使用Vector替代Array。
固定长度的Vector更快。(
Vector可以这样初始化:
var coords:Vector.<Number> = Vector.<Number>([132, 20, 46, 254, 244, 100, 20, 98, 218, 254]);)
* 新的drawing API更快,它们是:drawPath, drawGraphicsData, drawTriangles。
* 使用setVector()方法来处理像素。
* 使用setPixel()和setPixel32方法时,要配合使用lock()和unlock()方法。
* 使用TextField时,appendText()方法比+=操作符要快。
* 尽可能在避免在循环内更新TextField。
* 尽可能少使用方括号操作符访问Vector或Array元素,可以利用一个临时变量来操作。
* 尽量将代码内嵌,避免过多的函数调用。(比如用 value > 0 ? value : -value; 来代替Math.abs())
* 代码量过大也会造成性能的降低。尽量少使用大型第三方库(Flex, TLF)。
* 避免在循环内使用evaluating statements(myArray.length)。用临时局部变量来操作。
4. 渲染性能
* 尽可能避免使用alpha参数。
* 适当的使用cacheAsBitmap可以大幅提高性能。(对于变化少的矢量元件)
* 针对每个子元件使用cacheAsBitmap而不是针对父元件使用。
* 使用TextLine处理静态文本比TextField 快而且使用更少的内存。
* 使用cacheAsBitmap和opaqueBackground参数可以改进渲染性能(包含TextField)。