作者:阿里西西  文章来源:http://www.alixixi.com/  更新时间:2005-12-18
Actionscript优化教程 高级优化3

如果您从 Flash 5 开始,您应该记得 tellTarget 用来命令影片剪辑的方式。

尽管 Flash 5 和 Flash MX 都主张用点语法代替它,但是看起来过时的 tellTarget 反而做得更好。因此您可以考虑“贬低”一些代码以提高一点额外的速度。

检查这段代码:

MAX = 10000;

mc = _root.createEmptyMovieClip("test", 1000);

function test_dot() {

var i = MAX;

while (--i>-1) {

mc._x = 10;

mc._y = 10;

}

}

function test_tellTarget() {

var i = MAX;

while (--i>-1) {

tellTarget (mc) {

_x = 10;

_y = 10;

}

}

}

12) 访问局部变量( this 引用 vs. with 引用)
按此在新窗口浏览图片

局部变量和对象可以多于一种的方式被引用。

我们测试了两种方法,发现使用关键字 with 的结果最糟糕。

使用 this 可以达到更快的速度。

下面的代码用作测试,运行一个 10000 次循环

obj = {};

obj.a = 1;

obj.b = 2;

obj.c = 3;

obj.d = 4;

obj.e = 5;

obj.f = 6;

obj.g = 7;

obj.h = 8;

obj.test1 = useThis;

obj.test2 = useWith;

MAX = 10000;

function useThis() {

var i = MAX;

while (--i>-1) {

this.a = 1;

this.b = 2;

this.c = 3;

this.d = 4;

this.e = 5;

this.f = 6;

this.g = 7;

this.h = 8;

}

}

function useWith() {

var i = MAX;

while (--i>-1) {

with (this) {

a = 1;

b = 2;

c = 3;

d = 4;

e = 5;

f = 6;

g = 7;

h = 8;

}

}

}

13) 循环侦听按键
按此在新窗口浏览图片

侦听按键的优化方法与对 Math 函数名的检索的优化方法相同。

相对于每次都使用 if(Key.isDown(Key.LEFT)) ,更好的方法是设置一套引用,如下所示:

keyDown = Key.isDown;

keyLeft = Key.LEFT;

然后使用 if(keyDown(keyLeft))

我们也用键控代码值取代键控代码常数进行过测试,但是区别并不明显。 14)Math.floor() vs. int()
按此在新窗口浏览图片

这一点是由 iopred 在 Flashkit 论坛上提出来的( http://www.flashkit.com/board/showthread.php?s=38baf94bb869a0376c6f599d8bf2685d&threadid=434875 )。

使用过时的 int() 而不是新的 Math 库函数 floor() 。

我们的基准展示速度有明显的提高。 15)eval vs. 数组访问
按此在新窗口浏览图片

使用 eval() 函数取代 Flash MX 介绍的数组下标访问,我们发现状况并没有明显的改变。

换名话说下面的代码:

var mc = eval("_root.myMc"+i);

并不比下面的代码快:

var mc = _root["myMc"+i];

正如您能够从我们的图表中看到的一样,差别确实很小。 16) 通过影片剪辑循环 vs. ASBroadcaster 循环
按此在新窗口浏览图片

这个测试展示 Flash MX 未公开的 ASBroadcaster 对象是如何帮助从 Flash Player 中挤出额外的速度的。

这一基准创建 500 个影片剪辑然后测试删除它们需要多少时间。

循环版本针对每个影片剪辑调用 removeMovieClip() ,而 ASBroadcaster 版本为每个剪辑订制一个事件处理函数。当 broadcaster 发布这一自定义事件时,所有的影片剪辑处理这一事件,这将得到一个更好的结果。

这是循环版本:

MAX = 500;

SX = 550;

SY = 330;

MovieClip.prototype.onCustomEvent = function() {

this.removeMovieClip();

};

function init() {

var i = MAX;

var rnd = Math.random;

while (--i>-1) {

var m = _root.attachMovie("enemy", "e"+i, i);

m._x = rnd()*SX;

m._y = rnd()*SY;

}

}

init();

function bench() {

var t = getTimer();

var i = MAX;

while (--i>-1) {

_root["e"+i].onCustomEvent();

}

res.text = "time: "+(getTimer()-t);

}

同样的工作,使用 ASBroadcaster :

MAX = 500;

evtManager = {};

ASBroadcaster.initialize(evtManager);

SX = 550;

SY = 330;

MovieClip.prototype.onCustomEvent = function() {

this.removeMovieClip();

};

function init() {

var i = MAX;

var rnd = Math.random;

while (--i>-1) {

var m = _root.attachMovie("enemy", "e"+i, i);

m._x = rnd()*SX;

m._y = rnd()*SY;

evtManager.addListener(m);

}

}

init();

function bench() {

var t = getTimer();

evtManager.broadcastMessage("onCustomEvent");

res.text = "time: "+(getTimer()-t);

}

使用 Flash MX 2004 为 Flash Player 6 编译

关于 Flash MX 2004 的一个有趣事实是 ActionScript 编译器在许多方面作了改进。新的编译器处理全局( player 6 和 7 )和局部变量(仅仅 player 7 )能做得更好,这使得本文提到的一些压缩代码的技巧变得不那么重要。

通过我们的基准表,您可以发现,一些非常有趣的目标已经实现了。

我们关注的最需要注意的改进是 _global 变量看起来比时间轴变量快得多,嵌套循环比以前运行得更好。并且您也会发现几乎每个测试都比用 Flash MX 版本编译器版本运行得快。 总结:

通过精心地选择正确的方式编写代码,我们可以极大地改进 Flash Player 的表现,这是我们能够从所有这些基准中学到的。

尽管我们已经在这儿举出了为数不少的优化要点,仍然有更多的需要您亲自实验,为了展示其它的代码压缩技巧,更多的基准可能被创建。

我们认为最好的途径就是孤立那些非常消耗 CPU 的规矩,尽可能多地尝试这些建议,也要针对您遇到的具体问题独立进行一些测试。

如果您愿意,您可

网友评论
相关搜索
阿里西西Baidu.com搜索