仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1593|回复: 9
打印 上一主题 下一主题

[学习教程] 带来一篇优化Flash Actionscript代码的三种办法-Flash actionscript

[复制链接]
只想知道 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-15 22:49:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Flash动画说到底就是“遮罩+补间动画+逐帧动画”与元件(主要是影片剪辑)的混合物,通过这些元素的不同组合,从而可以创建千变万化的效果。
第一章AS3的一些优化盘算办法
JohnGrdenBlog

1.用乘法来取代除法(当除数可转化为无限数的时分)。好比varn:Number=value*0.5;要比varn:Number=value/2;快。但不同并非很年夜。只要在必要大批盘算情形下,好比3D引擎中不同才对照分明。
2.用位运算取代除2或乘2。好比10>>1要比10*2快,而10<<1要比10*2快。从测试来看位运算几近比乘除快一倍,可是一样平常情形下,我们不克不及选择位运算,好比我们就不克不及用13>>1来取代13/2,只管前者比后者运算速率更快,但2者的运算了局却纷歧样。以是仍是要看详细情形。
3.用unit()或int()取代取整运算Math.floor()和Math.ceil()。好比vartest:uint=uint(1.5);要比vartest:Number=Math.floor(1.5);快;而vartest:uint=uint(1.5)+1;要比vartest:Number=Math.ceil(1.5);也快。假如是Math.floor(),还能够用位运算(>>0)来取代。好比vartest:uint=1.5>>0,比unit()或int()更快。
4.用乘-1来取代Math.abs()办法。好比varnn:Number=-23;vartest:Number=nn<0?nn*-1:nn;要比varnn:Number=-23;vartest:Number=Math.abs(nn);快。
固然另有更多的优化盘算的办法。一样平常来讲,初级运算要比初级运算速率;外部办法比挪用其他办法速率快。别的要注重的是,这些办法有的时分大概并必定合用。


第二章Actionscript优化指南
来历gotoAndStop.it

原著MarcoLapi,aliasLapo,aw译

在这篇文章中,我们将会商多种优化Actionscript代码的办法.
别的我们也针对一些典范的游戏代码举行了系列测试,来最年夜限制的开掘、进步Flash播放器的功能。
什么时候举行优化
对现有程序举行优化的历程,偶然非常的冗杂与坚苦,这与原始代码的非优化水平有关,以是在投进大批工夫举行代码优化之前,最主要的是要估量出要在甚么中央对代码做出修正或交换。
一个游戏代码的最主要的部分就是主轮回体,一般情形下该轮回体要在flash的每帧上实行,并把持游戏中的脚色属性和主要的数据参数。而关于主轮回体之外的部分,也多是主要轮回部分,一样要注重是给其否分派了过量的资本,而没有分派给那些更必要资本的中心部分。
经由过程堆集在遍地勤俭出来的工夫(大概每处仅仅是几个毫秒),您会分明发明本人的swf运转得加倍不乱,而且游戏感也年夜年夜增强。
简便与高效的代码
誊写出非常简便、能够再次挪用的代码(偶然多是面向工具的)是一项精密的事情,但这必要多年的编程履历。关于OOP(objectorientedprogramming,面向工具的程序计划),有些场所基本使用不到它的上风,这使得它显得非常奢靡。在无限的资本前提下(多是flash播放器的缘故原由),经由过程更先辈的办法,像方才提到的OOP,便可能反而招致使人不中意的了局。
我们并非说OOP对游戏编程欠好,只是在某些场所它显得过于奢靡和过剩。究竟偶然候“传统的办法”却能失掉更好的了局。
大致而言,用OOP是对照好的,由于它让代码保护加倍复杂。但在后文中,你会看到偶然为了充实发扬flashplayer功能,而不接纳OOP手艺。比方:处置疾速转动大概盘算非常庞大的数学成绩。
基础的优化
一说起代码优化,我们即刻会遐想到实行速率的改善,而很少往思索体系资本的分派。这是由于现今,即便是将被减少的盘算机,都有充足的内存来运转我们年夜部分的flash游戏(128M的内存足以满意年夜多半情形的必要,何况,512M的内存是现今新电脑的基础设置)

变量
在各类主要的代码优化手腕中,有这么一条:在界说部分变量的时分,必定要用关头字var来界说,由于在Flash播放器中,部分变量的运转速率更快,并且在他们的感化域外是不耗占体系资本的。
aw附:var变量仅仅在花括号对中才有“性命”,团体以为没有体系学过编程的人简单堕落的一个中央:
awMC.onLoad=function(){
varaw=1;
}
awMC.onEnterFrame=function(){
//不存在aw这个变量
}
一段非优化代码:
functiondoSomething()
{
mx=100
my=100
ar=newArray()

for(y=0;y<my;y++)
{
for(x=0;x<mx;x++)
{
i=(y*mx)+x
arr=i
}
}
returnarr
}
这段代码中,并未声明函数体内的那些变量(那些仅仅在函数内利用的变量)为部分变量,这使得这些变量被播放器挪用的速率更慢,而且在函数实行终了的时分仍旧耗占体系资本。
上面列出的是经由改善的一样功效的代码:
functiondoSomething()
{
varmx=100
varmy=100
varar=newArray()

for(vary=0;y<my;y++)
{
for(varx=0;x<mx;x++)
{
vari=(y*mx)+x
arr=i
}
}
returnarr
}
如许一来一切的变量均被界说为下场部变量,他们可以更快地被播放器挪用。这一点在函数大批(10,000次)轮回运转时显得尤其主要!当一个函数挪用停止的时分,响应的部分变量城市被烧毁,而且开释出他们占据的体系资本。
onEnterFrame事务
onEnterFrame事务关于游戏开辟者而言长短常有效的,它使得我们可以疾速、重复地依照预设帧频(fps)运转一段程序。回忆在Flash5的时期,这(onEnterFrame及时监控)是一种十分盛行的手艺,用如许的事务来把持呆板游戏敌手的逻辑,又大概我们能够在每个枪弹上设置如许的事务来监测枪弹的碰撞。
实践上,我们其实不保举给过量的MoveClip增加如许的事务,由于如许做会招致“无眉目码(spaghetticode)”的呈现,而且简单招致程序效力分明下降。
年夜多半情形下,用独自一个onEnterFrame事务就能够办理成绩了:用这一个主轮回来实行你所必要的操纵。
另外一个复杂的举措是设置一个符合的帧频:要晓得帧频越高,CPU资本就越严重。
在帧频为25-35(fps)之间时,onEnterFrame足以很好地实行较庞大代码,哪怕你的盘算机设置较低。因而,在没有特别请求的场所,我们不保举利用高于60(fps)的帧频。
矢量图与位图
在处置图形前,我们必定要做出准确的选择。Flash能对矢量图和位图举行完善的兼容,但是矢量图和位图在播放器中的体现本色却完整分歧。
在用到矢量图的时分,我们要尽量简化它们的外形,往除过剩的端点。如许做将年夜年夜下降播放器用于出现矢量图所要举行的盘算量。另外一个主要方面在于线条的使用,只管削减和制止冗陈的线条布局,由于它们会间接影响到flash的播放效力。
当某个实例通明度小于100时,也会对播放速度形成影响,以是假如你发明本人的Flash播放速度过慢,就往挑出这些通明的实例来吧!
那末,假如真的必要出现对照庞大的场景时,你就最好思索利用位图完成。固然Flash在对位图的衬着效力上并非最优胜的(好比和Flash的“兄长”Director比起来),但丰厚的视觉内容出现只能靠位图(与位图同庞大度的矢量图形衬着速度十分低)了,这也是良多基于区块的游戏中普遍接纳像素图作为背景的缘故原由。特地要提到的是,Flash固然对GIF,JPG和PNG都有所撑持,可是衬着速率上PNG仍是占据相对上风,以是我们倡议flash中的位图都尽量接纳PNG格局。
影片剪辑(MovieClip)的可视性[上面将MovieClip简称为mc]
您大概会常常碰着如许一种情形:有大批不成见/屏幕外的mc守候进场(好比游戏中屏幕外的舆图、人物等等)。
要晓得,播放器仍旧要损耗必定的资本来处置这些不成见/屏幕外的mc,哪怕他们是单帧,非播放的形态。
最好的办理举措之一是给这些mc一个空缺帧,当他们不呈现在屏幕上时,你能用gotoAndStop()语句跳转到这一帧,从而削减播放器对资本的需求。
请务必记着,这类情形下,复杂的设置可见度属性为不成见(_visible=false)是有效的,播放器将持续依照这些mc所停止或播放的帧的庞大度来分派资本。

数组
数组在各类必要纪录数据的使用程序和游戏中都被普遍的利用。
一个典范的例子就是基于区块的Flash游戏,在如许一类的游戏中,舆图偶然被寄存成形如arr[y][x]的二维数组。固然这是一种很罕见的办法,可是假如用一维数组的话,却能进步程序的运转效力。另外一个主要的办法来进步数组效力是在数组遍历的时分利用forin轮回来取代传统的for大概while轮回语法。
比方:
一段代码以下
for(variinarr)
{
if(arr>50)
{
//举行某些操纵
}
}
它的实行速率分明高于这一段代码:
for(vari=0;i<10000;i++)
{
if(arr>50)
{
//举行某些操纵
}
}
前者的效力比后者进步了30%,这个数字在你的游戏要逐帧实行这一段代码的时分显得加倍可贵!
初级优化:
1)for轮回和while轮回
用while轮回将会失掉比for轮回更好的效力。但是,从数组中读取数据,用forin轮回式最好的选择!
以是我们不保举利用:
for(vari=0;i<1000;i++)
{
//举行某些操纵
}而保举利用
vari=-1
while(++i<1000)
{
//举行某些操纵
}

2)从数组中读取数据
我们经由过程测试发明,forin轮回的效力年夜年夜高于其他的轮回体例。参看:
arr=[]
MAX=5000
//数组赋值
for(i=0;i<MAX;i++)
{
arr=i
}
varitem=null
//For轮回
for(vari=0;i<MAX;i++)
{
item=arr
}
//For轮回
for(variinarr)
{
item=arr
}

//While轮回
i=-1
while(++i<MAX)
{
item=arr
}

3)向数组中写进数据(while,for)
能够看到while轮回稍占上风。

4)_global(全局)变量同Timeline(工夫轴)变量
我们推测接纳全局变量能进步变量挪用速率,但是效果其实不像估计的那样分明。

5)单行、多行变量赋值
我们发明单行变量赋值效力年夜年夜高于多行。好比:
a=0
b=0
c=0
d=100
e=100
效力就不如:
a=b=c=0
d=e=100

6)变量名寻址
这个测试反应了变量名的预寻址长短常主要的,特别是在轮回的时分,必定要先给丁一个指向。如许年夜小节约了寻址工夫。
好比:
varnum=null
t=getTimer()
for(vari=0;i<MAX;i++)
{
num=Math.floor(MAX)-Math.ceil(MAX)
}
t1.text="Alwayslookup:"+(getTimer()-t)
就不如:
t=getTimer()
varfloor=Math.floor
varceil=Math.ceil
for(vari=0;i<MAX;i++)
{
num=floor(MAX)-ceil(MAX)
}

7)短变量名和长变量名
变量名越短,效力越高。思索到长变量名也有它的优点(好比,便于保护等),因而倡议在关头部位(好比大批轮回呈现的时分)利用短变量名,最好就1-2个字符。

8)轮回前、后声明变量
在测试前,我们以为轮回前声明变量会加倍勤俭工夫,不意测试了局其实不分明,乃至还恰好相反!
//外部声明
t=getTimer()
for(vari=0;i<MAX;i++)
{
vartest1=i
}
t1.text="Inside:"+(getTimer()-t)
//内部声明
t=getTimer()
vartest2
for(vari=0;i<MAX;i++)
{
test2=i
}

9)利用嵌套的if布局
当用到庞大的前提表达式时。把他们打散成为嵌套的自力判别布局是最好计划。上面的代码我们举行了测试,发明这类效果改善分明!
MAX=20000
a=1
b=2
c=-3
d=4
vari=MAX
while(--i>-1)
{
if(a==1&&b==2&&c==3&&d==4)
{
vark=d*c*b*a
}
}
//上面的判别加倍节俭工夫
vari=MAX
while(--i>-1)
{
if(a==1)
{
if(b==2)
{
if(c==3)
{
if(d==4)
{
vark=d*c*b*a
}
}
}
}
}

10)寻觅部分变量(this办法同with办法对照)
部分变量的定位办法良多。我们发明用with比用this加倍有上风!
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
functionuseThis()
{
vari=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
}
}
functionuseWith()
{
vari=MAX
while(--i>-1)
{
with(this)
{
a=1
b=2
c=3
d=4
e=5
f=6
g=7
h=8
}
}
}

11)轮回监听键盘事务
同方才所提到的寻址一样,我们完成给一个指向会失掉更好的效力,好比:
keyDown=Key.isDown
keyLeft=Key.LEFT
//我们再用if(keyDown(keyLeft))
附:我们测试了按键代码和键值常量的效力发明并没有太年夜不同。

12)Math.floor()办法与int()
这个成绩曾在Flashkit的论坛被提出会商过。测试标明,旧的int办法反而效力更高。我们的测试了局也反应了这一点。

13)eval表达式与中括号语法
我们并没有发明分明的不同,其实不像方才所述那样,旧的eval表达式比起中括号办法并没有太年夜的上风
varmc=eval("_root.myMc"+i)
varmc=_root["myMc"+i]
//二者效力差未几16)触及MC的轮回:ASBroadcaster同欢同轮回的不同
结论
我们从这些测试了局中发明,关于分歧的需求,接纳分歧的代码,我们能够年夜年夜进步剧本的实行效力。固然我们在这里排列了很多的优化代码的办法,必要人人本人测试、实行的另有良多(思索到每一个人的需求分歧).假如你想加倍深切地会商这类成绩。能够来我们的论坛。
aw附:
终究翻译完了,本人也学到良多好器材,人人又甚么成绩能够往gotoAndPlay的官方,也能够来我的Blog提出!



第三章黑羽AS心得:浅释ActionScript的代码优化
Kingdablog

本文既为浅谈代码优化,那末就不深切到OOP计划层面。仅触及Flash8匡助内里提到的一些代码编写优化准绳,并加以注释。
原则来历于Flash8匡助,我做了一些注释:

1.制止从一个轮回中屡次挪用一个函数。
在轮回中包括小函数的内容,可以使效果更佳。小函数性命期短,利于资本开释。特别是在年夜的轮回中时。

2.尽量利用本机函数。
本机函数要比用户界说的函数运转速率更快。本机函数即Flash中内有的一些函数(intrinsic),好比hitTest(),你没需要本人写一个相似的。

3.不要过量利用Object范例。
数据范例正文应力图准确,如许能够进步功能。只要在没有得当的备选数据范例时,才利用Object范例。同时也便于代码办理,时候晓得工具的范例和感化。
同时也有益于编译器编译时优化。

4.制止利用eval()函数或数据会见运算符。
一般,较为可取且更无效的做法是只设置一次部分援用。不得已时才用eval,好比转换_droptarget为MovieClip时。

5.在入手下手轮回前将Array.length付与变量,特别是年夜的轮回。
在入手下手轮回前将Array.length付与变量(好比variLength:Number),将其作为前提利用,而不是利用myArr.length自己。
缘故原由,在轮回中,iLength是Number变量,会被放进存放器利用,效力远比会见Array再失掉length高。比方,应利用
varfontArr:Array=TextField.getFontList();
vararrayLen:Number=fontArr.length;
for(vari:Number=0;i<arrayLen;i++){
trace(fontArr);
}
来取代:
varfontArr:Array=TextField.getFontList();
for(vari:Number=0;i<fontArr.length;i++){
trace(fontArr);
}

6.注意优化轮回及一切反复举措。
FlashPlayer消费很多工夫来处置轮回(如利用setInterval()函数的轮回)。

7.在部分变量够用时,不要利用全局变量。类静态变量也要罕用。
全局变量是开辟者的噩梦。其实必要全局变量的话,我倡议利用singleton计划形式来举行办理。

8.声明变量时,增加var关头字。
这是为了编译时让编译器晓得你的变量范例,优化编译。

黑羽增补一点:对关头字的利用要审慎。
不同意利用关头字作为本人的method和属性名,除非你确认后续开辟不会用到不异的事务名和属性名。
但你怎样晓得flash利用了几埋没关头字?太多了!好比说className,invalidate,refresh,mouseOver等等不经常使用的关头词。好的办法是利用SEPY编纂器来写代码,那边面加亮了一切发布的和没有发布的关头词。
并且由于很有大概和start,load,等这些经常使用的事务名反复,带来代码不用要的修正和贫苦。

9.对触及到挪用画图资本的函数时,只管先多判别再挪用。
一切突变,地位变更,创立删除MC,组件等函数都触及到画图资本的挪用。在良多情形下,只管先用逻辑判别变量大概工具的属性,需要时再挪用这些函数。如许能够节俭较多的盘算资本。

AdobeFlashCS5.5中的动画制作更简单,借助基于对象的动画快速创建动画、轻松修改运动路径并全面控制个别动画属性。
灵魂腐蚀 该用户已被删除
沙发
发表于 2015-1-17 06:01:33 | 只看该作者
所以不要使用不必要的高祯率-否则老的、慢的计算机在显示动画时会阻塞。
飘飘悠悠 该用户已被删除
板凳
发表于 2015-1-20 14:59:01 来自手机 | 只看该作者
在Web上只好把动画做得很小。即使最简单的动画也需要较长的下载时间。Flash的流技术和矢量图形对这种情况做了改变。
深爱那片海 该用户已被删除
地板
发表于 2015-1-29 11:47:22 | 只看该作者
缺点方面~有些技术不能实现,不过FLASH技术在发展在进步,相信在以后FLASH可以取代,大部分的视频编辑软件,视频制作软件。
柔情似水 该用户已被删除
5#
发表于 2015-2-6 00:36:24 | 只看该作者
富媒体广告的概念:富媒体 Rich Media,是由英文翻译而来,从字面上很难理解Rich Media到底是什么。
再见西城 该用户已被删除
6#
发表于 2015-2-14 17:26:35 | 只看该作者
flash 有这么多的优势,那么它的优缺点和设计方面的关系是什么?
再现理想 该用户已被删除
7#
发表于 2015-3-4 09:19:09 | 只看该作者
专业的建筑动画、产品动画、角色动画、flash动画、游戏美工等全方位服务的创意动漫公司。十年专业的动漫制作经验,为政府、企业等制作出无数优秀的创意动画设计产品。
老尸 该用户已被删除
8#
发表于 2015-3-11 18:09:11 | 只看该作者
不过,要说国内在FLASH动画领域做的比较出色的,公认的是广州形动数码科技。
只想知道 该用户已被删除
9#
 楼主| 发表于 2015-3-19 06:29:52 | 只看该作者
原始动画为单纯的手绘,累而且费时耗资严重,随着科技的发展应运而生了很多制作动画的软件,然而flash在各个方面的应用尤为广泛,作用最为突出,具有一定的影响力。
飘灵儿 该用户已被删除
10#
发表于 2015-3-27 11:10:03 | 只看该作者
单纯的做动画而言,flash动画与传统动画有很多差别,这里会为你介绍什么是flash与flash与传统动画相比具有的优点和缺点,而进一步了解flash动画
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 12:43

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表