仓酷云

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

[学习教程] FLASH教程之Flash Actionscript 优化指南-Flash actionscript

[复制链接]
若相依 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-15 20:59:00 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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

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

x
占用硬盘空间少,所以被广泛应用于游戏、网络视频、网站广告、交互设计等。
第一章AS3的一些优化盘算办法

  • 用乘法来取代除法(当除数可转化为无限数的时分)。好比varn:Number=value*0.5;要比varn:Number=value/2;快。但不同并非很年夜。只要在必要大批盘算情形下,好比3D引擎中不同才对照分明。
  • 用位运算取代除2或乘2。好比10>>1要比10*2快,而10<<1要比10*2快。从测试来看位运算几近比乘除快一倍,可是一样平常情形下,我们不克不及选择位运算,好比我们就不克不及用13>>1来取代13/2,只管前者比后者运算速率更快,但2者的运算了局却纷歧样。以是仍是要看详细情形。
  • 用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()更快。
  • 用乘-1来取代Math.abs()办法。好比varnn:Number=-23;vartest:Number=nn<0?nn*-1:nn;要比varnn:Number=-23;vartest:Number=Math.abs(nn);快。固然另有更多的优化盘算的办法。一样平常来讲,初级运算要比初级运算速率;外部办法比挪用其他办法速率快。别的要注重的是,这些办法有的时分大概并必定合用。
第二章Actionscript优化指南
原著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的代码优化
本机函数要比用户界说的函数运转速率更快。本机函数即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,组件等函数都触及到画图资本的挪用。在良多情形下,只管先用逻辑判别变量大概工具的属性,需要时再挪用这些函数。如许能够节俭较多的盘算资本。

Flash是一种动画创作与应用程序开发于一身的创作软件,到2013年9月2日为止。
愤怒的大鸟 该用户已被删除
9#
发表于 2015-3-20 11:05:58 | 只看该作者
flash的优缺点可以如何运用呢?
小妖女 该用户已被删除
8#
发表于 2015-3-13 03:08:13 | 只看该作者
它包含了下列常见的形式之一或者几种的组合:流媒体、声音、Flash、以及Java、Javascript、DHTML等程序设计语言。  
精灵巫婆 该用户已被删除
7#
发表于 2015-3-6 13:39:43 | 只看该作者
祯率越高,动画中可包容的信息越多,动画看起来越光滑和流畅。当然,当祯率增加时,计算机的CPU的重绘工作越多,运行得就越慢。
admin 该用户已被删除
6#
发表于 2015-2-19 05:55:42 | 只看该作者
随着动漫发展趋势,我国也越来越重视动漫产业的发展,各种制作动画软件应运而生,其中flash比较突出。
飘飘悠悠 该用户已被删除
5#
发表于 2015-2-6 23:03:46 | 只看该作者
矢量图形相对于位图的另一个优势是可以随意缩放的能力。这是对动画进程的奖赏,对用户来说也是一个很酷的特征。在Flash之前,Web上没有这种功能。
金色的骷髅 该用户已被删除
地板
发表于 2015-1-31 16:47:09 | 只看该作者
不能设置“alt”属性,失去了一次被搜说引擎检索到的机会。
柔情似水 该用户已被删除
板凳
发表于 2015-1-23 07:09:18 | 只看该作者
祯率越高,动画中可包容的信息越多,动画看起来越光滑和流畅。当然,当祯率增加时,计算机的CPU的重绘工作越多,运行得就越慢。
老尸 该用户已被删除
沙发
发表于 2015-1-17 15:26:12 | 只看该作者
关于位图和矢量图形的区别,可参看Flash教程。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-9-23 05:29

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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