Actionscript优化教程
作者: 来源: 添加时间:2006-5-23 7:27:26在这篇文章中,我们讨论优化您的actionscript代码的各种不同方法,我们业已起用一套标准以测试典型的游戏代码和看看如何使Flash Player发挥最好的性能。
代码优化简介
在这篇文章中我们将要展示一些能够使您的Flash游戏获得更佳性能的技术。代码优化非常重要,它能使Flash Player资源得到更好的利用,使游戏在不同硬件上都能平稳运行。
这篇文章主要着眼于Flash Player 6的性能问题和解决它们的可用技术上。
Flash Player 7发布以后,这里面的一些问题已经得以解决,整体性能得到了改进,但在写作这篇文章时Flash Player 6正在流行,因此我们将把精力集中在这个版本
何时优化
对已有的代码进行优化可能是一个耗时长而且困难的工作,这取决于原来的代码不优化的程度。因此在投入无尽的时间之前最好先估计一下需要修改的代码的范围。
游戏代码中最受争议的通常是主循环部分,它在每一帧重复执行,对游戏角色、图像和状态数据进行更新。
主循环以外需要压缩的代码,可能是一些较长的循环结构:这时检查您并不是在浪费时间和资源也非常重要。
毫无疑问,通过从代码的不同部分节省若干毫秒,您的SWF文件将运行得更加平稳,您的游戏制作水平也将得到提高。
简洁VS有效:
书写十分简洁和可重用的代码(可能是面向对象的)是一门艺术,需要多年的经验,但有时表现得太昂贵。
当使用上面提到的高水平的途径应付有限的资源(就像Flash Player)时可能导致糟糕且不令人满意的结果。
我们并不是说OOP有害于游戏编程,而是说它需要消耗更多的时间,有时“旧编程学校(old programming school)”可能会通向更好的结果。
总之,为了使代码更简单,多数情况下应该利用OOP。但是过一会您将在本文中看到为了充分挖掘Flash Player的每一点性能,有时您需要避免使用OOP,例如当处理快速滚动或运行非常复杂的数学计算时。
基本的优化
今天,当谈及代码优化时我们通常指的是速度的提高和不要占用太多的内存,甚至不太新的计算机都有足够多的内存运行我们的Flash游戏(128MB对多数游戏来说都绰绰有余,如今一台新机器的标准已是512MB)。
>>变量
使用关键字var声明局部变量是最重要的优化方法之一。
局部变量可以更快地被播放器存取,当函数结束时可以被及时销毁。
例如一段不算好的代码如下所示:
function doSomething() {
mx = 100;
my = 100;
ar = new Array();
for (y=0; y<my; y++) {
for (x=0; x<mx; x++) {
i = (y*mx)+x;
arr[i] = i;
}
}
return arr;
}
这段代码不好是因为没有把变量声明为局部的,这使得访问它们的速度较慢,当函数结束的时候它们仍然存在而不被销毁。
改进的版本应该这样:
function doSomething() {
var mx = 100;
var my = 100;
var ar = new Array();
for (var y = 0; y<my; y++) {
for (var x = 0; x<mx; x++) {
var i = (y*mx)+x;
arr[i] = i;
}
}
return arr;
}>
这种情况下所有变量都被定义成局部的,它们都可以被快速访问。这对于一个循环运行10,000次的函数来说是非常重要的。当函数结束时,所有局部变量都将被销毁以释放系统资源。
>> onEnterFrame事件:
onEnterFrame事件使得可以按照SWF文件的帧频连续不断地运行代码,对游戏开发者来说非常实用。
追溯到Flash 5的时代,使用这些不同方式管理例如敌人或在onEnterFrame事件中发射子弹等等逻辑是一门常用的技术。
事实上并不推荐为所有存在的影片剪辑附加这些事件处理函数,因为这将导致冗余代码并将严重影响性能。
多数时候使用仅仅一个onEnterFrame可能是一个好的解决方案:仅用一个主循环使各种操作能够顺利进行。
另外一点简单的提示是将帧频(fps)参数设置为一个合理的值:记住,帧频越高,就需要越多的CPU资源以处理每一帧的代码。
介于25~35的帧频对于在每一帧运行一般复杂度的代码来说比较适合,即便是在一个速度较慢的机器上。超过60fps的帧频没有必要(除非有一个特殊的理由)。
>>位图VS矢量图:
讨论图像对于开始之前选择一条正确的途径非常重要。
Flash天衣无缝地使用矢量图和位图,但是这两者对Flash Player的影响完全不同。使用矢量图时尝试最大限度地排除冗余点以简化图形。这将有助于减少播放器花在每个矢量图上的计算量。
另一个重要的方面是轮廓线的使用,它几乎可以将动画的呈现效果置于死地。要尽可能地避免这些不良影响。
使用小于100的alpha值也会对整体速度造成坏的影响,因此当您明显感觉到速度减慢时请关注一下影片剪辑的alpha值。
如果您确实需要使用许多妖怪和许多动作,您可能需要考虑使用位图。
处理位图比处理矢量图速度快,正因为如此,许多基于分块的Flash游戏(title based Flash game)都是基于位图的,尽管如此,Flash处理位图的速度并不是冠军(例如和Director相比)。
Flash支持GIF、JPG和PNG格式的位图,后者的渲染速度比前两者快,因此推荐尽可能使用PNG格式的位图。
>>影片剪辑可见性:
您经常会使用大量位于屏幕以外的影片剪辑,它们等待着进入游戏的可见区域的机会来临。这通常发生在游戏区域比实际的游戏屏幕大的情况下。对于屏幕以外的事物,同样会占用一定数量的Flash Player资源,理解这一点非常重要(无论它们只有一个帧还是连接成动画的多个帧)。
解决这个问题的一个好办法是在影片剪辑中使用一个空白帧,可以使用gotoAndStop()跳转到该帧,以在一定程度上缓解Flash Player的压力。
请记住设置可见属性(_visible = false)对于节省播放器时间不起作用。
>>数组:
数组在应用程序中被广泛使用,游戏经常需要数组来存储数据。
一种典型的情况是一个基于分块的游戏,其中的游戏地图保存在一个二维数组中,类似于这样:arr[y][x]。
虽然这是一种很简单的技术,但是使用一个简单的一维数组可以加快您对游戏数据的访问。
另一条优化数组的方法是,使用for…in循环结构遍历数组取代for或while结构。
代码如下:
for (var i in arr) {
if (arr[i]>50) {
// do some processing here
}
}
已经证明比下面的代码运行速度快:
for (var i = 0; i<10000; i++) {
if (arr[i]>50) {
// do some processing here
}
}
快了30%!特别是想要在游戏主循环的每一帧都执行这样的代码,对于速度来说,这是一个不小的改进!