Flash AS3内存优化

本文介绍了Flash AS3的内存管理基础知识,包括Flash内存基本信息、垃圾回收机制及优化建议,如养成良好的内存使用习惯、及时清理释放对象、选择合适的数据类型、利用粒子池技术和重写显示对象机制等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Flash AS3内存优化

Flash内存基本信息

首先我们需要了解Flash内存基本信息,Flash创建对象都会想内存管理器,申请内存,占据一定的存存空间,对象有自身的生存周期,处于有效的生存周期内,变量是不会自动销毁释放,会一直占据内存;对象生存周期处于死亡状态,会自行销毁释放。基本数据类型:int、Number、String..,以及复杂类型(类、数组、向量等等)。

Flash垃圾回收机制

在avm2,之后采用的是标记-清除算法(Mark-Sweep) ,即,采用树的机制,从应用程序的根作为起点,采用广度优先遍历方式,标记出所有受到引用的对象,未标记的对象将被作为垃圾处理,进行回收。

Flash内存优化建议

1).养成良好内存使用习惯

从作为一个IT程序员开始,就时常和内存打交道了,so养成良好的内存使用习惯,是必不可少的能力,不要因为贪图一些小便宜,照成了大量的浪费,而且经常要善于思考和发现,对于自己所写的逻辑是否有更好的方案,能否占用更小的空间、时间,当然我们也需要在性能、维护上做出平衡的选择,并不是说,内存占用越少越好。经常听见说“哇,通过这次改动,同时在线人数500人,可以增加至800人”,这可是一个多么令人惊喜的事情啊。

2).及时清理释放对象

在平时的日常编程中,经常忘记从舞台中移除现实对象、将对象置为 null 、清除对象监听事件等等,这些垃圾会一直占据着内存,最终可能会导致性能掉帧,内存溢出等等,所以要在平时的编程中,时时刻刻提醒自己,及时的清除对象有关的引用,彻底释放对象。

3).选择合适的数据类型

这已经是一个老生常谈的问题了,在很多情况下是经验不足,导致选择错误的数据类型,就好比说 能使用Shape类型的地方,却硬生生的使用了Sprite类型,能够使用EventDispatcher,使用了MovieClip等等。一般来说,处于低层的数据类型,往往比处于高层的数据类型占用更小的空间(子类是通过对父类扩展所得到的,必然会增加额外的开销),所以在选择数据类型时,优先考虑能否使用处于低层的数据类型。

4).合适的利用对象

a.粒子池技术

粒子池:一个集合,可以包含一个或者多个对象,当需要对象时,从粒子池中提取,当需要销毁时,从粒子池中销毁。销毁时,粒子池会保留一定数量的对象(不将对象置为null,仅仅是清空重置数据),每次提取都会优先从无用取提取粒子,没有时则创建。

当一个或者多个类型需要平凡的创建或者销毁对象时,则可以考虑使用粒子池技术,比如 FPS游戏中的子弹,三消游戏中的方块等等。在场景切换时可以考虑是否销毁粒子池,不永久占用内存。

b.重复利用对象
for(var i:int; i < 100; i++){
    var item:Item = new Item();
    ....
}

可以考虑是否替换为

var item:Item = new Item();
for(var i:int; i < 100; i++){
    ....
}

5)统一管理相关事件

在键盘事件、帧频事件、舞台鼠标事件等等,可以考虑使用一个单例,来单独管理常用的事件,通过回调方式进行派发,避免对通用的事件进行平凡的监听,而且回调,比派发执行效率更快。

6)重写显示对象机制

Sprite对象,在移出舞台时,并不会自行销毁相关的事件监听,清除绘制内容,同时自行销毁包含的显示对象等,so,可以继承重写Sprite对象,使其更加智能、自动化。而且

public function removeAllChild():void
{
    this.graphics.clear();

    while(numChildren > 0)
    {
        var child:DisplayObject = this.getChildAt(0) as DisplayObject;
        this.removeChildAt(0)
        if(child is IDispose)
        {
            IDispose(child).dispose();
        }else if(child is Shape)
        {
            Shape(child).graphics.clear();
        }
    }
}

6).杂记

a.慎用滤镜,滤镜需要消耗大量的性能和内存,需要同时存储两张位图
b.存储图片时,只需要存储其BitmapData数据,重复使用该图片时,只需要重复利用该BitmapData。
c.正适当的情况下,将矢量图作为位图进行存储。
d.删除一个 SWF,Loader等时 要调用它的 unload() 方法并且把对象置 null;
e.慎用滤镜,滤镜需要消耗大量的性能和内存,需要同时存储两张位图

……………………

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值