您的位置: 首页 > 技术文档 > 多媒体制作 > ActionScript 3 日积月累之三
从 AS2 到 AS3 回到列表 ActionScript 3 日积月累之二
 ActionScript 3 日积月累之三

作者:awflasher 时间: 2007-05-13 文档类型:原创 来自:蓝色理想
浏览统计 total:542 | year:542 | Quarter:542 | Month:542 | Week:542 | today:97

作者相关,转载请保留
http://as3blog.com/as3/as3tip-take-care-of-resource

摒弃了attachMovie 之后的AS3,采用了类似DOM 的操作方式。addChild、removeChild 、getChildAt 等方法开始成为AS3中显示(在屏幕上渲染)、操作图形的主要方法。由于AS1、AS2完全是依赖于attchMovie 的思想,因此对于传统Flash开发人员来说,转变到新的addChild 的确需要下一番功夫。

由于新的“DisplayObject”在内存的使用上非常“敏感”。往往由于不良的编程习惯会造成不必要的内存泄漏,因此,我们不得不比AS1、 AS2时代更加深入到内存管理了。我想,每一个Flash开发人员,包括我自己,都应该花一番功夫仔细体会“内存管理”这几个字的含义。毕竟我们学习 AS3是为了开发比AS1、2时代更加先进、高效而且内存占用小的应用程序,如果还是开发一些简单的应用,也就失去我们每一个人使用AS3的意义了。

我觉得,由于GC是Flash 应用程序内存管理的核心,我应该先从AS3中的Garbage Collector(简称GC)开始说起。AS3的GC功能比AS1、2中的要强大的多。然而,强大的同时,也带来了一定程度的复杂性。但是也不至于非常复杂,我觉得比C++等传统语言要容易掌握得多。

在研究内存如何回收之前,先说一下变量的创建:

在Flash中,我们每建立一个非原生变量时(Boolean, String, Number, uint, int 这些是原生变量),这个变量名只是一个reference(指向,有时候也成为“引用”)而已,而并非这个变量本身。例如:
var a:int = 5; //a就是5
var b:int = a; //b是a,也就是5
a = 4;
trace(b); // 是5,而不是4!
//改变b的值,a不发生变化。反之亦然
var c:Object = {name:”aw”, blog:”www.awflasher.com/blog”}; //c只是指向一个内部的Object,为了描述方便,称其为“O”
var d:Object = c; //d指向c,指向了同一个Object“O”
c.name = “bw”
trace(d.name); //不是aw,而是bw了
//改变c也好,改变d也罢,其实是改变了那个“O”,因此改变c的时候,d的值也就变了。因此d.name已经被改变为了“bw”。

首先,明确一点,GC会按照一定的时间周期进行内存清理(memory sweep)。因此不要因为delete掉一个object后检查System.totalMemory 内存就没有反应而怀疑GC是否正常。那么GC为什么要按照一定的时间周期进行清理呢。这还要得从GC的具体工作原理说起。

GC的两个回收体系:
1、“Reference Counting” - 引用计数器
这个体系是自从AS1时代就有的体系,它的工作原理非常简单:系统计算每一个对象被指向,或者说引用的次数。比如
var a:Object = {name:”aw”, blog:”www.awflasher.com/blog”};

这时候,这个Object(我们仍然称为“O”),有一次引用,它的引用计数器为1(来自a)。我们再建立一个对象b,并指向到a:
var b:Object = a;

这时候“O”引用计数器变为了2(来自a、b)。
我们删除一个,比如先删除b:
delete b;
这时候引用计数器为(2-1=1)1,GC不操作
再删除另外一个a:
delete a;“O”引用计数器变为(1-1=0)0,GC出面干掉这个对象。
这套体系很轻便,CPU压力较小。但是它也有缺陷。当我们的对象内部互相引用的时候,麻烦就来了。例如:
var a:Object = {name:”aw”, description:”unknown”};

// 建立一个对象a,仍然假设内部对象为“O”,这时O的引用次数为1
var b:Object = {nameObj:a, url:”awflasher.com”};
// b引用了a,同时创建了新的内部对象“P”。这时O的引用次数为2,P为1
a.myDescription = b;
// a的myDescription属性指向到了b。这样,P的引用次数也为2了。
// 是不是有点头晕?静下来,画个图慢慢看看:)
delete a;
delete b;

两次delete操作后,O、P的引用次数都是1,它们将继续占用你的内存。“Reference Counting” 体系无能为力了。

2、“Mark Sweeping” - 标记清除法则

GC的第一种机制“Reference Counting”,在FlashPlayer8之前是GC唯一的机制。FlashPlayer6和7由于引入了复杂的OOP开发模式,尤其是7引入了类似Java、C++等强大OOP语言的语法。利用Flash设计的复杂项目越来越多。由于Flash开发人员大多不了解GC,而Java、C++的开发人员又已经习惯了强大的GC(无论是自动的还是手动的)。因此FlashPlayer6、7的内存问题开始浮现出来。

Okay,Flash Player8引入了新的“Mark Sweeping”机制。我想这也是当年Macromedia(Adobe)基于退出Player8的原因吧!(还记得当年Flash8的介绍视频么,效率提高是一个革命性的改进)

下面就来讲述“Mark Sweeping” - 标记清除法则的工作原理。
FlashPlayer会从root开始,遍历系统的每一个变量,并对有指向的对象之间,记录一次联系。在遍历结束之后,凡是与root不相联系的对象,被FlashPlayer无情地干掉。

Okay,回到刚才的例子,当我们delete a,并delete b之后,root与O、P就划清了界线。这时候,GC就可以进行一次肃清了。然而,由于这种“Mark Sweeping”要遍历所有的对象,因此非常消耗资源。这也就回到了当初的问题:“GC为什么要按照一定的时间周期进行清理“ - 因为不能给CPU造成太大的负担。

我个人猜测,GC的内部清除策略应该是在某一次事件(例如delete)发生后,在CPU比较空闲、RAM分配相对合理的情况下执行的。

Okay,不要以为有了“Mark Sweeping”就万事大吉了。由于GC不会即时进行,因此你的对象会在一段时间内“阴魂不散”!对于一个追求完美的开发人员来说,这意味着它们内部的某些机制会在被删除之后继续工作:AS语句会继续执行、声音会继续播放、事件会继续触发!

KirupaForum有网友说,“All you got to do is pray the garbage collector doesn’t break down.”,确实,如果一个应用程序要运行上一个多小时,那么慢慢流逝的内存会让你的用户对你的产品失望(例如游戏)。因此我们需要有一个良好的资源管理策略。

待续……

经典论坛讨论:
http://bbs.blueidea.com/thread-2745066-1-1.html

本文链接:http://www.blueidea.com/tech/multimedia/2007/4705.asp 

出处:蓝色理想
责任编辑:elesa

◎进入论坛Flash专栏版块参加讨论

相关文章 更多相关链接
从 AS2 到 AS3
ActionScript 3 日积月累之二
ActionScript 3 日积月累之一
二进制在FLASH中的应用
Flash处理XML文档数据教程
作者文章 更多作者文章
ActionScript 3 日积月累之二
ActionScript 3 日积月累之一
Adobe的P2P野心
理性思考Flash与Ajax相关问题
背叛时间轴·突破IDE
热门搜索:CSS Fireworks 设计比赛 网页制作 Dreamweaver Studio8 Flash
站点最新 站点最新列表
设计师的生活态度和侦探
"注册"比"登录"更醒目?
牛牛和妞妞
从 AS2 到 AS3
ActionScript 3 日积月累之三
ActionScript 3 日积月累之二
ActionScript 3 日积月累之一
用javascript 转换外部链接样式
用CSS属性选择器控制链接样式
网页中各度量单位的比较
栏目最新 栏目最新列表
从 AS2 到 AS3
ActionScript 3 日积月累之三
ActionScript 3 日积月累之二
ActionScript 3 日积月累之一
用javascript 转换外部链接样式
用CSS属性选择器控制链接样式
网页中各度量单位的比较
二进制在FLASH中的应用
Flash处理XML文档数据教程
PS制作从乌云中透出阳光

蓝色理想版权申明:除部分特别声明不要转载,或者授权我站独家播发的文章外,大家可以自由转载我站点的原创文章,但原作者和来自我站的链接必须保留(非我站原创的,按照原来自一节,自行链接)。文章版权归我站和作者共有。

转载要求:转载之图片、文件,链接请不要盗链到本站,且不准打上各自站点的水印,亦不能抹去我站点水印。

特别注意:本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

本文暂时没有评论和评分

您的评论
用户名:  口令:
说明:输入正确的用户名和密码才能参与评论。如果您不是本站会员,你可以注册 为本站会员。
注意:文章中的链接、内容等需要修改的错误,请用报告错误,以利文档及时修改。
不评分 1 2 3 4 5
注意:请不要在评论中含与内容无关的广告链接,违者封ID
请您注意:
·不良评论请用报告管理员,以利管理员及时删除。
·尊重网上道德,遵守中华人民共和国的各项有关法律法规
·承担一切因您的行为而直接或间接导致的民事或刑事法律责任
·本站评论管理人员有权保留或删除其管辖评论中的任意内容
·您在本站发表的作品,本站有权在网站内转载或引用
·参与本评论即表明您已经阅读并接受上述条款
推荐文档 | 打印文档 | 评论文档 | 报告错误  
专业书推荐 更多内容
Don't Make Me Think 第2版
HTM与CSS入门经典(第7版)
《FLASH MX2004网站开发精粹》
《CSS入门经典》
《网页配色密码》
《设计师谈网页设计思维》
《Photoshop实用技能案例详解》