加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Flash AS3内存优化

发布时间:2020-12-15 20:06:39 所属栏目:百科 来源:网络整理
导读:Flash AS3内存优化 Flash内存基本信息 首先我们需要了解Flash内存基本信息,Flash创建对象都会想内存管理器,申请内存,占据一定的存存空间,对象有自身的生存周期,处于有效的生存周期内,变量是不会自动销毁释放,会一直占据内存;对象生存周期处于死亡状

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.慎用滤镜,滤镜需要消耗大量的性能和内存,需要同时存储两张位图

……………………

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读