如果您从 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; } } } |

局部变量和对象可以多于一种的方式被引用。
我们测试了两种方法,发现使用关键字 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;
}
}
}

侦听按键的优化方法与对 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 的一个有趣事实是 ActionScript 编译器在许多方面作了改进。新的编译器处理全局( player 6 和 7 )和局部变量(仅仅 player 7 )能做得更好,这使得本文提到的一些压缩代码的技巧变得不那么重要。
通过我们的基准表,您可以发现,一些非常有趣的目标已经实现了。
我们关注的最需要注意的改进是 _global 变量看起来比时间轴变量快得多,嵌套循环比以前运行得更好。并且您也会发现几乎每个测试都比用 Flash MX 版本编译器版本运行得快。 总结:
通过精心地选择正确的方式编写代码,我们可以极大地改进 Flash Player 的表现,这是我们能够从所有这些基准中学到的。
尽管我们已经在这儿举出了为数不少的优化要点,仍然有更多的需要您亲自实验,为了展示其它的代码压缩技巧,更多的基准可能被创建。
我们认为最好的途径就是孤立那些非常消耗 CPU 的规矩,尽可能多地尝试这些建议,也要针对您遇到的具体问题独立进行一些测试。
如果您愿意,您可