Tag Archives: ActionScript

谈谈ActionScript垃圾回收(上)

在《给AS程序员的一点建议一文》中我提到了释放资源的重要性。最近在一些项目过程中我又对这方面有了更多的理解,在此希望能够分享给大家。首先让我们来回顾一下关于垃圾回收(Garbage Collection,下文简称GC)的一些知识。要阅读本文,你需要对GC机制有些基本认识。

在ActionScript中,我们没有API可以直接删除一个对象,也不能控制Player进行GC。但是GC的行为是可以预估的,作为开发者,我们需要了解的是GC执行的时机是发生在需要向操作系统请求分配内存的时候。

从上面的模拟图我们可以看到:

  • Player以块的方式请求和释放内存。GC的结果不一定就是更少的内存占用,也有可能是从操作系统获得更多的可用内存。
  • Player会在某些GC过程中把内存中未使用部分组合成可以释放的块还给操作系统。
  • 此外还要注意的是Player为了避免占用太多的CPU资源,会将一些GC操作分到不同的时间片中运行,所以一次GC过程并不一定清理完所有可回收资源。

一次GC过程(GC Pass)分为以下两个步骤: Continue reading

Flash CS5.5 ‘Visible’ Property Issue

最近在项目中遇到一个问题。某个从SWC库中实例化的symbol总是引起crash,检查了一下发现如果存为CS5的版本发布就没有问题。于是就顺藤摸瓜发现了CS5.5的一个小问题。新的属性面板(下图)包含了一个设置visible的参数,方便我们不需要写AS代码就可以设置这个常用的参数。引起crash的symbol正是用了这个小功能。如果像我那样发布出SWC再用SDK编译,可能就会在实例化的时候没有任何报错地直接crash。

分析使用了这个功能的swf文件,发现并没有生成任何AS代码。那么应该是Flash IDE隐藏的工作吧,只是不知道这个功能的内部实现机制是什么。虽然这个功能很贴心,但是使用SWC工作流程的同学们还是暂时无视吧。

RobotGaiaAnt Demo

我在再谈Gaia结合Robotlegs进行开发一文中提到的视图接口注入方法,在Robotlegs更新到1.4版本以后就失效了。问题出在以下这行代码:

  1. mediatorMap.mapView(IModule, ModulePageMediator, IModule);

在新版的Robotlegs下并不会生成对应的Mediator。经过一番研究后发现要改写MediatorMap才行,幸好已经有人开发出了ViewInterfaceMediatorMap插件,省了我很多工作。这个插件使用很简单。用以下代码来覆盖掉默认的mediatorMap就可以支持视图的接口注入了:

  1. override protected function get mediatorMap():IMediatorMap
  2. {
  3. return _mediatorMap ||= new ViewInterfaceMediatorMap(contextView, createChildInjector(), reflector);
  4. }

我已经将该插件包含到RobotGaiaAnt 0.7的更新中,同时提供了一个简单的例子来演示这套框架的运行情况:RGADemo

这个例子包含了两个页面HomeMember。其中Home是一个通常的简单页面,而Member页面继承了ModulePage,是作为一个Robotlegs模块存在,包含独立的MemberContext

  1. override public function set parentInjector(value : IInjector) : void
  2. {
  3. super.parentInjector = value;
  4.  
  5. context = new MemberContext(this, false, value, loaderInfo.applicationDomain);
  6. }

我们可以在初始化的时候就自动启动Context。也可以选择在transitionIn()函数执行的时候再启动,这样能够引用到这个页面下包含的各项资源。但是在本例中两种启动时机都可以。

Continue reading