| 首页 | 新闻 | 网页 | 设计 | 色彩 | 原创 | 视觉 | 素材 | 动漫 | 酷站 | 策划 | 文案 | 访谈 | 运营 | 编程 | 数据库 | 服务器 | 下载 | 图库 | 
您的位置: 幽幽天空 > 网页 > 网页制作 > Flash教程 > ActionScript教程 > 文章正文 用户登录
TinyURL免费缩短网
龙太极/100m/asp/
无限网络提供50M 
苏能科技100M/FTP
悠博科技50M/FTP/
华云网络30M/FTP/
RealTracker提供免
Flash Remoting -
XML connector的讨
ASP+FLASH+ACCESS

Actionscript优化教程 高级优化3           

Actionscript优化教程 高级优化3

作者:佚名 来源:闪吧 作者: Marco Lapi,alias Lap 更新:2007-1-13 20:48:02 错误报告 我要投稿

11)tellTarget vs. 点语法
按此在新窗口浏览图片

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

尽管Flash 5Flash 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()
按此在新窗口浏览图片

这一点是由iopredFlashkit论坛上提出来的(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 2004Flash Player 6编译

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

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

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

总结:

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

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

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

如果您愿意,您可以更深入地讨论这些话题。



文章录入:skyuu    责任编辑:skyuu 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    发表评论:
    姓名:  评 分: 1分 2分 3分 4分 5分
     
  • 严禁发表危害国家安全、政治、黄色淫秽等内容的评论。
  • 用户需对自己在使用幽幽天空服务过程中的行为承担法律责任。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表机友个人观点,与本网站立场无关。