AS3-非炼金高速内存访问的杂记

说实话,最近的项目,越做越无聊了,核心的东西基本完成,剩下的几乎都是体力活,没什么新鲜好玩的。昨天打完工人物语7,睡意正浓,突然看了两个提神的网页:[http://www.buraks.com/azoth/](http://www.buraks.com/azoth/) 和 [http://philippe.elsass.me/2010/05/as3-fast-memory-access-without-alchemy/](http://philippe.elsass.me/2010/05/as3-fast-memory-access-without-alchemy/) ,这一下子精神就来了。FlashPlayer中读写ByteArray速度应付某些变态需求的时候,总会力不从心,这两天[徐灿](http://www.asblog.org/)被搞得非寻找个离经叛道的非官方手段不可,结果还就真找到了。我之前听闻haXe的高效率是因为作者找到了FlashPlayer10为炼金术提供的底层接口,但因为种种原因没有去使用haXe,看到这俩网页又让我看到了新的花样,原来是一个圈子里的货。它们三个都是找到了FlashPlayer10给炼金术开的“后门”在低层提高性能。

Flash

Loader的资源不释放

昨天遇到个内存泄露的情况。查到最后发现加载外部的一个.swf里面的倒影截的位图没清除导致的。 推测loader.unloadAndStop()虽然会关闭流,但是并不释放被加载的程序中产生的BitmapData。 切记:**除了纯粹的试听对象,所加载的外部程序中有监听、回调、创建了BitmapData的,此外部程序在被unload前请自行了断。**否则你再怎么gc都吃着内存。

Flash

[转]回收FLASHPLAYER内存资源

架的时候遇到了内存资源的问题,一开始我就使用YouYee Player 来进行测试,新加入的Browser用来帮助YouYee Player浏览播放列表,因为基于新框架的设计的原因,所有的弹出窗口方式都模拟了Flex中的机制,利用一个PopUpManager来实现,经过对内存的反应测试反复开启关闭Browser内存剧增,大约每执行一次这样的操作就会消耗400K-500K的内存,虽然Flash Player内部有自动的垃圾回收器,但是却一直没有看到效果。实际上PopUpManager的执行机制:声明创建一个新的对象,再将其添加到制定的层(舞台),当该对象关闭的时候监听到事件,把其从舞台移除,并且标记为null。 理论上这样的机制就能让垃圾回收器把废置的Browser回收掉,但是为什么随着操作的进行,内存确完全没有降低呢?理论上我把所有的引用都删除了才对。带着这些问题我查找了许多资料,最后在官方找到了Resource management strategies in Flash Player 9这篇文章,表面上文章只是介绍了垃圾回收的一些机制,并没有涉及到具体的方法,对Sprite类的回收根本就是没有提及,但是里面有一段文字强调了,使用弱引用,在对舞台设置监听的时候使用弱引用,这样可以帮助垃圾回收器进行回收。我一下子想起来实际上框架中的很多组件都对舞台进行了监听,好在他们是利用StageProxy这个代理类来进行监听的,所以我只要把StageProxy这个类中的监听方法写成弱引用,那么问题就解决了。 最后重新进行测试,结果令人满意,内存在增长了一段时间后又开始回落,因为垃圾回收器开始工作了。所以对于Sprite(DisplayObject)类的删除应当注意如下:1、先利用removeChild将其移出舞台。2、删除所有的引用,也就是说把其设置为null,而不是使用Delete,Delete仅对动态成员有效。3、注意所有的Stage监听器,把他们注销,最好的方法是一开始注册监听器的时候就指定为弱引用。

Flash