【转】Flash高性能开发基础系列—内存篇

转自:青竹的日志


内存优化在项目是一个重要的环节,如果不合理的利用和回收内存会合你的程序整体大大下降.

合理使用对象

创建不同对象一般所消耗的内存是不一样的。如:Number 消耗 8 个字节,int消耗4个字节, uint消耗 4个字节.下面我举一些例子:

1. int 类可使用表示为 32 位带符号整数的数据类型。 int类表示的值的范围是:-2,147,483,648 (-2\^31)2,147,483,647 (2\^31-1),所以如果你的取值范围在 -2,147,483,648 (-2\^31)2,147,483,647 (2\^31-1) 请你用int而不是用Number(刚从2.0转过来的人可能喜欢用Number)
uint 范围是0 到 4,294,967,295 (2\^32-1) 之间, Actionscript3 中类型很少,所以这些只要你平时稍加注意一下就行.

2. 合理使用Shape与Sprite,MovieClip,你可能用MovieClip可以完成Sprite与Shape的功能,但是他们所需的内存是不一样的Shape需要 236 字节,Sprite 需要 412字节, MovieClip 需要440字节,如果你只想显示图形没有交互那你使用Shape,如果是有交互的图形你可以用Sprite,如果是动画你才用MovieClip.

以上只是2个常见的实例,其实在as3中还有很多值得注意的这类情况。我还看到有些大哥为了派发一个事件而去继承Sprite类,Sprite需要消耗400字节, EventDispatcher只需要40字节。

继续阅读【转】Flash高性能开发基础系列—内存篇

使用URLLoader载入文本和XML-ActionScript3 Tips and Tricks

本文是ActionScript3 Tips and Tricks系列阅读笔记之一Loading Text and XML with URLLoader,查看所有的笔记

在AS3以前的版本中,要载入外部文本,可以使用LoadVars类和XML类。但是在AS3中,这些功能被移到了一个类中,这就是URLLoader(flash.net.URLLoader)类,这个类与LoadVars很相似。而AS3的XML类中,已经没有了载入外部XML文件的功能。我们可以使用URLLoader类获取外部的文本,并将其解析成普通文本或者XML对象。

就像LoadVars类一样,URLLoader类也有一个load()方法载入外部源的数据。这个方法允许一个URLRequest类的实例(而不是一个字符串)作为它的为一个参数。你可以使用URLLoader的事件决定载入完成之后该做什么。载入成功之后,URLLoader中的data属性将包含载入的文本值。

var loader:URLLoader;
// ...
loader = new URLLoader();
loader.addEventListener(Event.COMPLETE, xmlLoaded);

var request:URLRequest = new URLRequest("file.xml");
loader.load(request);
//...
function xmlLoaded(event:Event):void {
    var myXML:XML = new XML(loader.data);
    //...
}

trace的多参数支持-ActionScript3 Tips and Tricks

本文是ActionScript3 Tips and Tricks系列阅读笔记之一Multiple Arguments in trace(),查看所有的笔记

trace函数可以在Flash的输出面板(Flex Builder的Console面板)中显示信息。在ActionScript1和ActionScript2中,trace函数只能接收一个参数,而在ActionScript3中,trace函数可以接收多个参数:

trace(value1, value2, value3);

实际上,在ActionScript1/2中也可以做到。只需要使用数组:

trace([value1, value2, value3]);

ZRong注:实际上,以上的两段代码的显示结果是不同的,ActionScript3 的 trace ,会将每隔参数的值以空格分开,而ActionScript1/2使用数组作为参数,显示的结果是以逗号分隔的。

获取实例的类或超类名-ActionScript3 Tips and Tricks

本文是ActionScript3 Tips and Tricks系列阅读笔记之一Determine Instance Class or Superclass,这里是原文地址

在ActionScript3中,可以使用getQualifiedClassName函数( flash.utils.getQualifiedClassName)获取实例的类名:

var sprite:Sprite = new Sprite();
trace(getQualifiedClassName(sprite)); // 输出"flash.display::Sprite"

还可以使用getQualifiedSuperclassName函数 ( flash.utils.getQualifiedSuperclassName ) 获取超类的名称:

// 输出"flash.display::DisplayObjectContainer"
trace(getQualifiedSuperclassName(sprite)); 

继续阅读获取实例的类或超类名-ActionScript3 Tips and Tricks

使用ByteArray进行对象深度拷贝-ActionScript3 Tips and Tricks

本文是ActionScript3 Tips and Tricks系列阅读笔记之一“Deep Object Copies with ByteArray”,这里是原文地址

使用ActionScript3中新提供的 ByteArray类(flash.utils.ByteArray)可以创建一个对象的深度拷贝。“深度”的意思是可以拷贝一个对象(object)的所有引用,这意味着如果你拷贝一个包含对象的数组,那么数组中的对象也被拷贝(而不是引用)。下面是一个clone方法:

function clone(source:Object):* {
var copier:ByteArray = new ByteArray();
copier.writeObject(source);
copier.position = 0;
return(copier.readObject());
}

注意:你需要先导入 flash.utils.ByteArray

要使用这个方法,可以使用下面的代码:

newObjectCopy = clone(originalObject);

虽然这个方法可以深度拷贝你的对象,但是它不会一同拷贝类的类型定义。所以,如果查需要拷贝一个MyClass实例,拷贝出的对象将不在是MyClass类型。这个方法最好在普通对象上使用。 继续阅读使用ByteArray进行对象深度拷贝-ActionScript3 Tips and Tricks

抽象类-ActionScript3 Tips and Tricks

本文是ActionScript3 Tips and Tricks系列阅读笔记之一,这里是原文地址

很不幸,ActionScript3不支持抽象类(abstract classes),抽象类不能被实例化,并且只能扩展一次。所以,你不能在Flash中创建自己的抽象类。让我们先来了解一下Flash Player中内置的抽象类:

对于抽象类来说,你不能使用new关键字来建立它们的实例。

ActionScript 代码:

var myObj:InteractiveObject = new InteractiveObject(); // 错误

当然,你也不可以继承它们并试图建立子类的代码。

ActionScript 代码:

package {
    import flash.display.DisplayObject;
    public class MyDisplay extends DisplayObject{
        public function MyDisplay (){
            // 错误
        }
    }
}

不过,你可以继承内部抽象类的子类。例如,如果需要继承DisplayObject,你可以继承Shape类。Shape就是DisplayObject的子类。

新的变量类型-ActionScript3 Tips and Tricks

本文是ActionScript3 Tips and Tricks系列阅读笔记之一New Variable Types,这里是原文地址

新的变量类型

ActionScript3支持更多的变量类型,基本的类型包括:

简单类型:

* Boolean
* int
* null
* Number
* String
* uint
* undefined

合成类型:

* Object
* Array
* Date
* Error
* Function
* RegExp
* XML
* XMLList

其他的类型涉及它们的类,例如:Matrix (flash.geom.Matrix), Shape (flash.display.Shape), URLRequest (flash.net.URLRequest)等等。

一些提示: 继续阅读新的变量类型-ActionScript3 Tips and Tricks

图形对象和绘图API-ActionScript3 Tips and Tricks

本文是ActionScript3 Tips and Tricks系列阅读笔记之一Graphics Object and the Drawing API,这里是原文地址

图形对象和绘图API

就像ActionScript1和2一样,ActionScript3也有绘图API,你可以使用它们在影片剪辑和sprite对象中绘制矢量线条或图形。使用ActionScript3,绘图API总是在显示对象(例如影片剪辑、sprite等等)的graphics属性(flash.display.Graphics)中使用。graphics属性表现为绘图API绘制出的一个动态层。就像以前一样,这个动态层位于绘图目标对象的所有的子对象之下。在ActionScript3中,提供了一些新的方法让你绘制矩形、圆形以及圆角矩形变得更加容易。它们包括: 继续阅读图形对象和绘图API-ActionScript3 Tips and Tricks

类的活动范围已经绑定到类方法-ActionScript3 Tips and Tricks

本文是ActionScript3 Tips and Tricks系列阅读笔记之一Class scope is now bound to class methods,这里是原文地址

类的活动范围已经绑定到类方法(Class scope is now bound to class methods)

(也不知标题这么翻译是否正确,应该大致是这个意思把,简单的说,这个技巧就是讲解this的引用的问题。ActionScript2中,如果位于某个对象的事件处理函数中,this就指向发出这个事件的对象,而在ActionScript3中,this始终都指向类)

ActionScript3是完全基于类的。当你创建类时,你创建的变量和函数(方法)对这个类以及实例起作用。与ActionScript2不同,方法在被调用的时候保留它所属的类的活动范围,即使这个方法被指派给另一个对象并从另一个对象调用,或者使用Function.call和Function.apply也是如此。范例如下: 继续阅读类的活动范围已经绑定到类方法-ActionScript3 Tips and Tricks