辣鸡

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

一、Flash游戏中ActionScript代码优化

1、脚本运行速度的检测

var started:Number = getTimer();

……

执行代码

……

var runTime=getTimer() - started;

2、充分运用Flash Player新功能

·Vector类与Array类;

·新的绘图API

·处理像素的新方法;

·事件捕获和冒泡;

·其他

3Vector类与Array

Flash Player 10引入了Vector类,其读写访问速度比Array类更快。

var coordinates:Array = new Array();

var started:Number = getTimer();

for (var i:int = 0; i< 300000; i++)

{

coordinates[i] =Math.random()*1024;

}

trace(getTimer() - started);

// output: 107

 

var coordinates:Vector.<Number>= new Vector.<Number>();

var started:Number = getTimer();

for (var i:int = 0; i< 300000; i++)

{

coordinates[i] =Math.random()*1024;

}

trace(getTimer() - started);

// output: 72

注意:尽可能尝试使用Vector对象API,因为它们的运行速度可能更快。

4、新的绘图API

Flash Player 10提供了一个新的绘图API,使用它可获得更好的代码执行性能。

此新绘图API包含下列方法:

·drawPath()

·drawGraphicsData()

·drawTriangles()

注意:此新的API不提供显示性能改进,但可以大大减少必须编写的代码行数。代码行越少,AS执行性能越好。

5、处理像素的新方法

Flash Player 10中引入了快速绘制及读取像素的方式

·setVector()

·getVector()

注意:好果使用setPixel()setPixel32,请使用lock()unlock();减少遍历像素的次数;配合Vector类来提高像素处理速度;

6、事件捕获和冒泡

ActionScript3.0中的事件模型引入了事件捕获和事件冒泡的概念。

for ( var i:int = 0; i< MAX_NUM; i++ )

{ ……

// Listen to the MouseEvent.CLICKevent

enemy.addEventListener ( MouseEvent.CLICK, onEnemyClick );

}

……

container.addEventListener ( MouseEvent.CLICK, onEnemyClick,true );

for ( var i:int = 0; i< MAX_NUM; i++ ) { …… }

注意:使用事件捕获和冒泡可以最大程度地减少事件处理。

7、其他

·利用mouseEnabledmouseChildren属性禁用鼠标交互;

·对于TextField,使用appendText()方法,而不要使用+=运算符;

·将重复使用的变量定义在循环之外;

·尽可能避免使用中括号[]运算符;

·对while循环使用相反的顺序(while(--i>-1{}

·对文本基本搜索和提取时,使用String类方法而非正则表达式;

·使用位移运算符(<<,>>)替换乘除运算符(*,/

···········

 

二、Flash游戏中的图像优化

1、将矢量图形平滑处理

如使用Flash Professional Illustrator减少矢量图形的控制点。

注意:简化矢量图形的复杂路径可以大大提高游戏的平均帧速率

2、采用正确的图片压缩方式

注意Fireworks可以用PNG8格式高效的压缩带Alpha通道的图片(此功能PS暂不支持)

3、采用轻量级的UI组件

注意:大量使用UI组件是隐形的效率杀手;采用传统的buttonSprite等代替某些组件;

 

4、用位图替代矢量图形

·将滤镜特效在图片处理过程中添加

·创建合适大小的位图

·从Flash8开始,引入了cacheAsBitmap功能

注意:对自身无动画的MC进行位图缓存;更改对象的xy属性不会导致重新生成缓存位图;旋转、缩放对象或更改其alpha值的行为都将重新生成缓存的位图,从而降底性能;AIRPackager for iPhone中提供的DisplayObject.cacheAsBitmapMartix属性没有上述限制。

 

三、Flash游戏中的内存优化

1、选择适当的显示对象

不同显示对象的内存使用量(字节数)

trace(getSize(new Shape()));

// output: 236

trace(getSize(new Sprite()));

// output: 412

trace(getSize(new MovieClip()));

// output: 440

注意:对于非交互式简单形状,使用Shape对象;对于不需要时间轴的交互式对象,使用Sprite对象;对于使用时间轴的动画,使用MovieClip对象;将新文本引擎用于只读文本,将TextField对象用于输入文本。

2、重复利用游戏元素

注意:尽可能重复使用对象而不是重新创建对象;使用对象池,重复使用对象而非设置为null

3、释放内存

删除对对象的所有引用以确保触发垃圾回收

Object=null

注意:AS3delete仅是删除动态对象的动态属性;在将对象的引用设置为null之前,先确保正确地停用对象;如对象用作事件侦听器,先removeEventListener();清除BitmapData对象时,先调用dispose()方法;Flash Player 10.1AIR 1.5.2以上版本,disposeXML()新方法;

4、冻结和解冻对象

只有确保对象没有被使用,才能有效的进行内存回收

注意:使用Event.REMOVED_FROM_STAGEEvent.ADDED_TO_STAGE事件正确冻结和解冻对象;Flash Player 10Loader类新方法unloadAndStop(),通过此方法,可以卸载SWF文件、自动冻结加载的SWF文件中的每个对象并强制运行垃圾回收器。

 

四、Flash游戏中的渲染优化

1、重绘区域选项

找到“谁偷吃了你的奶酪”,可以使用flash.profiler.showRedrawRegions()方法以编程方式启用此选项。

注意:在游戏开发过程中常用重绘区域,找到隐藏的垃圾元件。

2、选择适合你的游戏渲染引擎

Sprite vs BitmapData

Draw vs CopyPixel

……

注意:位图数据作为游戏元件效率会明显高于SpriteMovieClipCopyPixel方法速度远大于Draw ;对于需要旋转的游戏元件,预先旋转位图并缓存,再CopyPixel

3、其它

尽可能避免使用alpha属性;

使用位图缓存和opaqueBackground属性;

GPU

 

五、其它优化

优化网络通信及数据交互;

优化音视频;

……

 

六、监测游戏性能的工具

·Stats类:http://code.google.com/p/mrdoob/wiki/stats

·PerformanceTest类:

http://www.gskinner.com/blog/archives/2009/04/as3_performance.html

·Flash Builder探查器

·FlexPMDhttp://opensource.adobe.com/wiki/display/flexpmd/FlexPMD

posted on 2012-04-09 15:54  辣鸡  阅读(653)  评论(0编辑  收藏  举报