新浪UED

Flash性能优化-内存优化

by windflasher / 前端开发,博客 / 2010-11-17
Flash性能优化-内存优化

在日常的Flash开发,flash对终端内存消耗大的问题常常困扰着我们。结合adobe官方博客以及日常开发的经验,我对flash开发内存优化做了一个小小的总结…

1.显示对象和原始类型
ActionScript3.0包含很多显示对象,当然最为常用的是Shape,MovieClip和Sprite。因此合理的运用适当的显示对象是降低内存消耗的技巧之一。

  • (1)对于非交互简单图形,请使用Shape对象
  • (2)对于不需要时间轴的交互对象,请使用Sprite对象
  • (3)对于使用时间轴的动画,请使用MovieClip对象

测试(注:getSize()-显示对象在内存中占有的字节数)
trace(getSize(new Shape()));
//output:236
trace(getSize(new Sprite()));
//output:412
trace(getSize(new MovieClip()));
//output:440

如果没有为表示64位值的数字分配值,虚拟机将其分配 8 个字节。所有其他原始类型存储时均占用4个字, String类型非原始类型存储根据该对象长度计算
var a:Number;
trace(getSize(a));
// output: 8
var b:int;
trace(getSize(b));
// output: 4
var c:uint;
trace(getSize(c));
// output: 4
var d:Boolean;
trace(getSize(d));
// output: 4
var e:String;
trace(getSize(e));
// output: 4
而String的内存占用是根据该String对象的长度
var name:String;
trace(getSize(name));
// output: 4
name = "";
trace(getSize(name));
// output: 24

2.对象的重用
在日常的开发中,我们可能这样coding:
var a:Rect;//Rect是一个自定义类
for (var:int = 0; i < 100; i++)
{
a = new Rect();
}
在这个循环中我们对该对象反复创建,这样会导致该对象使用了过多的内存,同时速度很慢,因此我们应尽可能的重复使用对象而避免重复的创建对象,这也是优化内存消耗的技巧之一。代码如下:
var a:Rect = new Rect();//Rect是一个自定义类
for (var:int = 0; i < 100; i++)
{
a.x = i;
}
另一个比较使用的解决方法是对象池。在初始化应用程序期间创建一定数量的对象并将其存储在一个池中,例如Array或Vector对象。对一个对象完成操作后,停用该对象以免它占用CPU资源,然后删除所有相互引用。然而,不要将引用设置为null,这将使它符合垃圾回收条件。只需将该对象放回到池中,在需要新对象时可以对其进行检索。

3.内存的释放
目前在FlashPlayer的发行版中无法直接启动垃圾回收器。要确保将一个对象作为垃圾回收,请删除对该对象的所有引用,而在ActionScript1.0和2.0中使用的旧delete运算符在ActionScript3.0中有不同的行为。它只能用于删除动态对象的动态属性(注:在Adobe AIR和FlashPlayer的调试版中可以直接调用垃圾回收器)。例:
var mySprite:Sprite = new Sprite();
mySprite = null;
当对象设置为null时,不必将其从内存中删除。如果系统认为可用内存不是足够低,垃圾回收器可能不会运行。垃圾回收的执行时间是不可预知的。内存分配(而不是对象删除)会触发垃圾回收。当垃圾回收器运行时,它将查找尚未收集的对象的图形。垃圾回收器通过在这些图形中查找相互引用但应用程序不再使用的对象,从而检测出处于非活动状态的对象。将删除通过这种方式检测到的处于非活动状态的对象。

在大型应用程序中,此进程会占用大量 CPU并影响性能,还可导致应用程序运行速度显著降低。通过尽量重复使用对象,可限制使用垃圾回收。此外,尽可能地将引用设置为null,以便垃圾回收器用较少处理时间来查找对象。将垃圾回收看作一项保护措施,并始终尽可能明确地管理对象生存期(将对显示对象的引用设置为null不能确保冻结该对象,该对象在作为垃圾回收之前,仍将占用CPU周期。在将对对象的引用设置为null之前,先确保正确地停用对象)。

4.文本对象
FlashPlayer10引入了一个功能强大的新文本引擎flash.text.engine(FTE),该引擎可以节省系统内存。但是,FTE 是一个低级API要求在其上使用其他ActionScript3.0层。对于只读文本,最好使用新文本引擎,它占用较少的内存并提供更好的呈现效果。对于输入文本,最好使用TextField对象,因为在创建典型行为(例如,输入处理和自动换行)时需要的ActionScript代码较少。
5.位图
许多开发工程师都喜欢使用矢量(而不是位图),因为这是节省内存的好方法。然而,使用矢量(特别是大量矢量),会显著增加对CPU或GUP 资源的需求。因此,位图是优化呈现的一个好方法,因为Flash Player在屏幕上绘制像素需要的处理资源少于呈现矢量内容。下面总结了几点:(1)通过尽量重复使用实例来优化BitmapData类的使用(嵌入的图像可来自库或[Embed]标签)。

在 Flash Player 10.1 之前的版本中,内存中为每个实例都提供了一个单独的位图,如下图所示:
Flash性能优化-内存优化

而在 Flash Player 10.1中:
Flash性能优化-内存优化

因此,我们在要完成一个平铺效果的时候可采用beginBitmapFill()方法,从而节省内存的消耗。

(2)尽量减少滤镜效果
滤镜的使用导致要求大量的CPU和GPU处理。因此,减少滤镜的使用可优化内存消耗。

6.尾声
希望这个分享能大家日后的工作带来启发,关于flash性能优化的话题,我还会继续(内存优化的重中之重-位图的优化)…

文章评论

  1. 匿名 说:

    我顶黄瓜

  2. jacky 说:

    总结的很好但是不完整!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

* 验证图片 刷新验证码

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>