AS3一些技巧(全部转自网上)

1.Numeric Calculations: Number vs. int Speed

比较Number类型和新出现的int类型速度

*只有在用到 bitwise operations (<<, >>, &, ^, and |) 的时候 int 类型比较快,例如
var valueN:Number = 10;
result = valueN << 2; // not so fast

var valueI:int = 10;
reesult = valueI << 2; // Fast!

*其他情况下声明为Number比较快

2.Class member enumeration
as3中只有dynamic class 中的dynamic definitions才可以被枚举(就是for in ),例如下边的class就没有可枚举的成员
package {
 
 public class EnumerateClass {
 
 public var variable:String = "value";
 public function method():void {}
 }
}
var example:EnumerateClass = new EnumerateClass();
for (var key:String in example) {
 trace(key + ": " + example[key]); // 没有输出
}

即使上边的class改成dynamic的,也是没有输出,为什么呢?

因为里边的变量和方法是他们自己的,而并不是动态(dynamic)填加的,只有动态填加的属性可以被for in

Object类有个 setPropertyIsEnumerable方法,可以控制某个属性是否可枚举,但它只对dynamic属性有效
package {
 
 public dynamic class EnumerateClass {
 
 public var variable:String = "value";
 public function method():void {}
 
 public function EnumerateClass(){
 this.dynamicVar = 1;
 this.dynamicVar2 = 2;
 this.setPropertyIsEnumerable("dynamicVar2", false);
 }
 }
}

上边的dynamic类有两个dynamic属性, dynamicVar 和 dynamicVar2 ,满足条件,都应该是可枚举的

但调用 setPropertyIsEnumerable("dynamicVar2", false);阻止了枚举 dynamicVar2
var example:EnumerateClass = new EnumerateClass();
for (var key:String in example) {
 trace(key + ": " + example[key]); // dynamicVar: 1
}

propertyIsEnumerable方法可以测试某一属性是否可枚举
trace(example.propertyIsEnumerable("variable")); // false
trace(example.propertyIsEnumerable("dynamicVar")); // true
trace(example.propertyIsEnumerable("dynamicVar2")); // false

3.System.totalMemory
System 类 (flash.system.System) 有一个新属性叫做 totalMemory,返回当前flash player占用的内存
var o:Object = new Object();
trace(System.totalMemory); // 4960256
var o:MovieClip = new MovieClip();
trace(System.totalMemory); // 4964352
4. Weak References
使用弱引用来引用对象,不会被垃圾回收器视为有效的引用数。这样可以帮助垃圾回收器的工作
所以使用弱引用这是一种比较好的编程习惯,使你不会在不经意间错误的引用到了某个object导致这个object不能被从内存中卸载~~~
但不是哪里都可以使用弱引用的,as3中有两处可以使用:
(1)在Directionary类的构造函数中传入true
var dict:Dictionary = new Dictionary(true); // use weak references as keys
var obj:Object = new Object();
dict[obj] = true;
delete obj; // 虽然dict中有引用到obj,但并不是一个有效引用,所以obj仍然会被垃圾回收

(2)在EventDispatcher的addEventListener 的第5个参数指定true
// addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
addEventListener(MouseEvent.CLICK, clickHandler, false, 0 true); // use weak references

5.Garbage Collection: Reference Counting & Mark and Sweep
垃圾回收机制包含两个关键:

(1)Reference Counting (引用数) :

引用数就是在内存中引用同一个object的变量多少,每增加一个变量引用该object,引用数就+1
var a:Object = new Object(); // new Object in memory given reference count of 1
var b:Object = a; // Object now has reference count of 2
无论什么时候,当没有变量引用该object的时候,垃圾回收就会把他们回收了
delete a; // Object has reference count of 1
delete b; // Object has reference count of 0, removed from memory
注意delete只能删除非成员变量,而且删除的是引用该object的变量而不是将object从内存中删除,那是垃圾回收器要做的事
看下边这种情况:
var a:Object = new Object(); // reference(a) count 1
var b:Object = new Object(); // reference(b) count 1
a.b = b; // reference(b) count 2
b.a = a; // reference(a) count 2
delete a; // reference(a) count 1
delete b; // reference(b) count 1
虽然a和b变量被删除了,而且我们再也不能用程序访问到他们了,但他们仍然存留在内存中~这种情况下垃圾回首器就没有办法了吗?错!这是记号清理要做的!

(2)Mark and Sweep (记号清理):

Mark and Sweep简单来说就是一种扫描机制,如下图,从root开始,扫到对象就mark一下,并扫描这个对象,等待全扫描完了,没有mark的自然是没有用的了,就会被从内存中删掉了.
[root] <- scan...
[objectRef (marked)] <- scan...
[objectRef (marked)] <- scan...
[objectRef (marked)] <- scan...
[objectRef (marked)] <- scan...
[objectRef (marked)] <- scan...
...
[delete all objects not marked]
当然这种扫描是昂贵的,需要很长时间才能发生一次,所以不要指望他了,编程的时候多注意引用数就可以了
6.Determine Instance Class or Superclass
as3中可以很容易的获取某个实例所属的类和父类的类名,使用这两个方法

getQualifiedClassName (flash.utils.getQualifiedClassName).
getQualifiedSuperclassName (flash.utils.getQualifiedSuperclassName)
var sprite:Sprite = new Sprite();
trace(getQualifiedClassName(sprite)); // "flash.display::Sprite
trace(getQualifiedSuperclassName(sprite)); // "flash.display::DisplayObjectContainer"

你甚至可以由字符串获得类的引用,使用这个方法

getDefinitionByName (flash.utils.getDefinitionByName).
getDefinitionByName("flash.display::Sprite")); // [class Sprite]
7.Deep Object Copies with ByteArray
as3中很容易使用(flash.utils.ByteArray)类来进行对象的深拷贝,深拷贝不只拷贝引用,而是拷贝整个相关对象,

例如一个array里包含一个object引用,这个object也将被拷贝

注意:这个方法通常用来拷贝一般的object

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

使用方法:
newObjectCopy = clone(originalObject);

8.动态改变帧频:
 // change frame rate to 12 fps:
 stage.frameRate = 12;//这个在导入外部swf文件时很有用

9.Abstract Classes
as3不支持抽象类,但有几个内置的抽象类

DisplayObject
InteractiveObject
DisplayObjectContainer
Graphics

as3中这意味着不能实例化这些类,也不能继承他们 ,以下为错误操作:
// 错误1

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

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

//希望以后的版本可以尽快支持abstract class

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值