圣叹@游戏开发

我们面对现实,我们终于理想

trace("Inside Tamarin::GC")

| |
00:22 , Qizhi
  Mozilla和Adobe在Tamarin的项目主页上没有多少文档,信息量其实少的可怜,绝大多数是要看源代码来理解的。其核心模块MMgc(垃圾回收)与Nanojit LIR(JIT编译器)也都是开源的,这为我们理解Actionscript3语言(语言相关的核心功能,显示与渲染相关的是闭源的,Adobe辩解说其中有H.264等视频专利授权的版权原因)有很大帮助。
  要学好语言,最好的方法是自己去写一门语言。当然学写C++或Actionscript3就算了:)但是我们可以阅读他们。
  在使用AS3写时,最需要关注的莫过于内存管理了。我们看看AVM+(Flash虚拟机)是如何管理内存的。AVM1代(Flash7之前)使用的是传统的引用计数算法(FIFE(www.fifengine.de)游戏引擎目前也采用的这种算法。这个算法类似这样:
Object() { refCount = 0; }
  void AddRef() { refCount++; }
  void Release() {
    if (!--refCount) delete this;
  }

  这是最简单也最直观的回收算法了。当时的Micromedia工程师在没有压力的情况下,居然将这种算法用了7代,这是一种什么样的精神:) 引用技术算法最大的问题在于没法解决交叉引用的bug。比如A应用了B的同时,B也引用了A,那么这两个对象是永远无法被销毁的。AVM+改进了引用计数算法,是一种延期执行的引用计数算法,并且堆和栈的策略不同。首先栈里的数据进进出出,来的快死的也快,这里是没有也不需要任何引用计数策略的。引用计数只发生在堆-堆之间的引用中。网上流行的文章中,很多人批评Flash里的GC是发生在不可控制的时机的。在理解了MMgc的原理之后也许就不会有这样的质疑了。既然栈里的数据没有引用技术,那么当引用为0时立即清除会抛出一个悬摆指针。为了解决这个问题,MMgc选择将这些引用为0的对象暂时保存到一个列表(更确切的将,是一个散列表)ZCT中,当该表达到最大值时,会发生一次回收。此时MMgc会扫描栈,将未引用ZCT的数据杀掉,释放内存。
  MMgc同时结合了另外一直垃圾回收的算法─标记清楚法,也是一种十分常见的GC算法。每一个对象都会包含一个标记位,在算法的第一阶段:标记阶段,由根节点开始扫描所有对象,将所有能抵达的对象标记一下,那么所有不能到达的对象即为可被回收对象。当然,这种算法针对不同的对象也采用不同的策略。
  其他还有很多细节,比如内存分配的策略,每次可分配内存的大小等,可以查看Tamarin(https://developer.mozilla.org/en/Tamarin)相关文档,或直接看源代码。
  MMgc是非常独立的一个模块,也就是说,如果要写C++有希望能引入GC,那么选择这个开源库是不错的。唯一要注意的是协议采用了MPL/GPL/LGPL,商业应用可以选择MPL以避免GPL的感染。

一家之言,非Adobe官方文档,如有不当,还请指正。
类别:Program | Tags: , , 评论(1) 阅读(708)
网友评论(1):
littlewater
Email Homepage
2010/05/16 07:37
之前弄过一个复用回收厄,比较烦恼一个多次引用的问题

设计时候没处理好多线程同时释放和申请- -
分页: 1/1 第一页 1 最后页
发表评论:

昵称: 
电邮:
网址: