`
steely816
  • 浏览: 127312 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

as3对象池(转)

    博客分类:
  • as3
阅读更多

另一个重要优化称为对象池,涉及到不断重复使用对象。在初始化应用程序期间创建一定数量的对象并将其存储在一个池中,例如 Array 或 Vector 对象。对一个对象完成操作后,停用该对象以免它占用 CPU 资源,然后删除所有相互引用。然而,不要将引用设置为 null ,这将使它符合垃圾回收条件。只需将该对象放回到池中,在需要新对象时可以对其进行检索。

重用对象可减少实例化对象的需求,而实例化对象成本很高。还可以减少垃圾回收器运行的机会,从而提高应用程序运行速度。以下代码演示对象池技术:

package 
{ 
    import flash.display.Sprite; 
     
    public final class SpritePool 
    { 
        private static var MAX_VALUE:uint; 
        private static var GROWTH_VALUE:uint; 
        private static var counter:uint; 
        private static var pool:Vector.<Sprite>; 
        private static var currentSprite:Sprite; 
  
        public static function initialize( maxPoolSize:uint, growthValue:uint ):void 
        { 
            MAX_VALUE = maxPoolSize; 
            GROWTH_VALUE = growthValue; 
            counter = maxPoolSize; 
             
            var i:uint = maxPoolSize; 
             
            pool = new Vector.<Sprite>(MAX_VALUE); 
            while( --i > -1 ) 
                pool[i] = new Sprite(); 
        } 
         
        public static function getSprite():Sprite 
        { 
            if ( counter > 0 ) 
                return currentSprite = pool[--counter]; 
                 
            var i:uint = GROWTH_VALUE; 
            while( --i > -1 ) 
                    pool.unshift ( new Sprite() ); 
            counter = GROWTH_VALUE; 
            return getSprite(); 
             
        } 
  
        public static function disposeSprite(disposedSprite:Sprite):void 
        { 
            pool[counter++] = disposedSprite; 
        } 
    } 
}

SpritePool 类在初始化应用程序时创建新的对象池。getSprite() 方法返回这些对象的实例,而 disposeSprite() 方法释放这些实例。代码允许池容量用尽时可以增长。还可以创建固定大小的池,这样当池容量用尽时将不会分配新对象。尽可能避免在循环中创建新对象。有关详细信息,请参见释放内存 。以下代码使用 SpritePool 类检索新实例:

const MAX_SPRITES:uint = 100; 
const GROWTH_VALUE:uint = MAX_SPRITES >> 1; 
const MAX_NUM:uint = 10; 
  
SpritePool.initialize ( MAX_SPRITES,  GROWTH_VALUE ); 
  
var currentSprite:Sprite; 
var container:Sprite = SpritePool.getSprite(); 
  
addChild ( container ); 
  
for ( var i:int = 0; i< MAX_NUM; i++ ) 
{ 
    for ( var j:int = 0; j< MAX_NUM; j++ ) 
    { 
        currentSprite = SpritePool.getSprite(); 
        currentSprite.graphics.beginFill ( 0x990000 ); 
        currentSprite.graphics.drawCircle ( 10, 10, 10 ); 
        currentSprite.x = j * (currentSprite.width + 5); 
        currentSprite.y = i * (currentSprite.width + 5); 
        container.addChild ( currentSprite ); 
    } 
}

以下代码在当单击鼠标时,将删除显示列表中的所有显示对象,并在以后的其他任务中重复使用这些对象:

stage.addEventListener ( MouseEvent.CLICK, removeDots ); 
  
function removeDots ( e:MouseEvent ):void 
{ 
    while (container.numChildren > 0 ) 
        SpritePool.disposeSprite (container.removeChildAt(0) as Sprite ); 
}


注: 池矢量始终引用 Sprite 对象。如果要从内存中完全删除对象,需要对 SpritePool 类使用

dispose()

方法,从而删除所有剩余引用。

分享到:
评论

相关推荐

    对象缓存池AS3实现

    纯as3代码实现对象缓存,对应频繁需要创建和销毁的对象,采用一个缓存队列,保存一定数量的对象,当需要的时候从队列里取出,不再需要的时候交给缓存池。

    loanshark:快速、灵活且经过全面单元测试的 AS3 对象池实用程序

    LoanShark 是一个灵活且高性能的对象池实用程序,用 AS3 编写。 它久经沙场,经过全面单元测试并积极维护。 如何使用它 对于构建繁重的自定义类特别有用,只需实例化 LoanShark 实例,传入您选择的类即可。 然后,您...

    对象池优化

    对上一个版本的对象池模块做了优化,提升性能,修改了明显的几处性能瓶颈。

    javascript 构建一个xmlhttp对象池合理创建和使用xmlhttp对象

    如果我们在客户端频繁使用ajax技术,...建立一个保持xmlhttp实例的池,好处显而易见,最明显的优点就是我们不会创建冗余对象,同时也不会出现在同一个正在被调用的xmlhttp实例上出现再次被操作的情况。 具体实现思路

    tmsh2JSON:将F5 Big-IP配置导出到JSON Blob中,适合以声明方式提交到F5 AS3接口

    这些库为您提供了访问和修改虚拟对象,池和配置文件等配置对象的工具。 此tmsh脚本从现有虚拟服务器配置中生成JSON Blob。 然后,可以将JSON Blob馈送到AS3,以进行无标度的部署应用程序服务和/或添加到CI / CD...

    allas:PostgreSQL“监听通知”连接池

    allas是的连接池,仅支持LISTEN / NOTIFY。 这个想法是允许应用程序在事务池模式下使用pgbouncer,而仅通过allas接收通知。 allas仅使用单个PostgreSQL连接,并在该连接上适当地进行LISTENing和UNLISTENing的处理,...

    spring.net中文手册在线版

    25.5.对象池示例 25.5.1.实现Spring.Pool.IPoolableObjectFactory 25.5.2.使用池中的对象 25.5.3.利用executor执行并行的grep 25.6.AOP 第二十六章. AOP指南 26.1.简介 26.2.基础知识 26.2.1.应用通知 26.2.2.使用...

    Openstack基础知识-PPT.pptx

    3. Swift对象存储服务(Object Storage as a Service) 4. Cinder块存储服务(Block Storage as a Service) OpenStack公共服务包括: 1. Glance镜像服务(Image as a Service) 2. Keystone认证服务(Identity as...

    CLR.via.C#.(中文第3版)(自制详细书签)Part3

    4.2.1 使用C#的is和as操作符来转型 4.3 命名空间和程序集 4.4 运行时的相互联系 第5章 基元类型、引用类型和值类型 5.1 编程语言的基元类型 5.1.1 checked和unchecked基元类型操作 5.2 引用类型和值类型 5.3...

    Delphi使用ADO连接池(存储过程示例)

    //关闭存储对象的资源 ADOStoredProc.Close; finally //调用结束,释放资源 ADOObject.Free; end; end; procedure TForm2.FormCreate(Sender: TObject); var ADOConn:TADOConnection; begin (***********...

    CLR.via.C#.(中文第3版)(自制详细书签)

    27.8.3 调用EndXxx方法时总是使用相同的对象 27.8.4 为BeginXxx和EndXxx方法使用ref,out和params实参 27.8.5 不能取消异步I/O限制操作 27.8.6 内存消耗 27.8.7 有的I/O操作必须同步完成 27.8.8 FileStream特有...

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    4.2.1 使用C#的is和as操作符来转型 4.3 命名空间和程序集 4.4 运行时的相互联系 第5章 基元类型、引用类型和值类型 5.1 编程语言的基元类型 5.1.1 checked和unchecked基元类型操作 5.2 引用类型和值类型 5.3...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    4.2.1 使用C#的is和as操作符来转型 4.3 命名空间和程序集 4.4 运行时的相互联系 第5章 基元类型、引用类型和值类型 5.1 编程语言的基元类型 5.1.1 checked和unchecked基元类型操作 5.2 引用类型和值类型 5.3...

    Flash 反编译工具(JPEXS Free Flash Decompiler) v3.0 中文版.zip

    转至文档类( AS3 ) 代理 - 配置您的浏览器使用我们的代理 - 代理嗅探http通讯和搜索SWF文件 - 找到SWF文件可以编辑的地方,然后通过代理再担当 搜寻记忆 - 搜索主权财富基金在其他进程的内存 搜索浏览器...

    pooled-ws-client-test:池化 JAX-WS 客户端示例

    调用 servlet 时,它将创建一个代理对象池,并使用该池同时调用 JAX-WS 端点。 ###Building/Deploying 通过运行mvn install构建项目。 通过运行mvn jboss-as:deploy将项目部署到本地 JBoss。 ###运行测试使用 URL...

Global site tag (gtag.js) - Google Analytics