`
steely816
  • 浏览: 129380 次
  • 性别: 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实现

    在ActionScript 3(AS3)中,由于其基于ECMAScript的特性,对象创建和销毁可能会导致一定的性能影响,因此对象池模式的应用尤为必要。 接下来,我们将探讨如何用AS3实现对象缓存池。首先,我们需要定义一个基类或...

    对象池优化

    对象池技术就是一种常用的优化手段,特别是在ActionScript 3(AS3)这种面向对象的编程语言中。本文将深入探讨“对象池优化”,以及如何通过工厂方法改进对象管理,以提高程序效率。 对象池是一种设计模式,它预先...

    flash 3d 效果内附as3源码

    7. **优化技巧**:为了确保在Web上流畅运行,可能涉及到一些优化技术,比如批次渲染、对象池管理、内存管理和性能监控。 学习这些源码可以帮助开发者深入了解AS3的3D编程,提高他们的技能,并能应用于实际项目,...

    as3算法大全

    位运算可以提高计算速度,对象池则能减少频繁创建和销毁对象带来的开销。 八、网络通信算法 AS3中的Socket和URLLoader类支持网络通信。TCP和UDP协议、HTTP和FTP请求,以及JSON或XML数据交换都是页游网络通信的基础...

    as3游戏开发简单游戏框架

    10. **对象池**:对象池是一种优化技术,用于复用游戏对象,避免频繁创建和销毁对象带来的性能开销。 在学习这个“简单游戏框架”时,你可以通过分析源代码了解上述各个部分的实现方式,并尝试修改和扩展它以适应...

    as3实现纸的折叠效果

    6. **对象池和性能优化**:为了提高性能,可以考虑使用对象池来复用图形对象,避免频繁创建和销毁导致的内存开销。同时,通过合理地缓存和复用矩阵、图形数据,也能提升动画的流畅度。 7. **编程技巧**:最后,良好...

    23种设计模式实例及说明大全(as3语言描述)

    在AS3中,可以使用弱引用和池技术来实现。 8. 装饰模式(Decorator):动态地给一个对象添加一些额外的职责。AS3中的DisplayObjectContainer类可以添加多个子对象,实现装饰功能。 9. 外观模式(Facade):为子...

    AS3的打地鼠游戏

    合理使用对象池防止过多的对象创建,以及适时清除不再使用的对象,都是优化游戏性能的重要手段。 9. **发布和测试**:最后,将项目导出为SWF文件,可以在Web浏览器中测试。通过不断调整和优化,确保游戏在不同平台...

    Flash AS3 工具性能输出窗口

    7. **代码优化**:常见的优化策略包括使用位运算代替浮点计算、避免不必要的对象创建、使用共享对象池、以及利用DisplayObject的cacheAsBitmap属性提高渲染效率。 8. **性能分析工具**:除了内置的性能输出窗口,...

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

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

    as3 资源加载管理

    对于大资源的缓存,你可能需要自定义解决方案,比如使用内存对象池或者将资源分解成更小的部分来加载和缓存。 在白鹭引擎中,`RES`模块提供了一个完整的资源管理解决方案,包括预加载、缓存、按需加载等功能。如果...

    [心得] AS3游戏中可视对象上限及位图相关的内存消耗实测

    因此,开发者需要谨慎管理舞台上的对象数量,合理使用显示对象池,及时清理不再使用的对象,以避免内存泄漏。 接下来是位图相关的内存消耗。位图数据在AS3中是内存消耗的主要来源之一,特别是在处理大量图片或复杂...

    as3 抽奖小程序(图片)

    3. **BitmapData对象**:AS3中的`BitmapData`类用于处理像素级别的图像数据。在抽奖程序中,可能需要创建`BitmapData`对象来加载和显示图片,然后将其与舞台上的`Bitmap`对象关联。 4. **事件驱动编程**:AS3采用...

    AS3相关资料

    1. **对象池**:预先创建一组对象并存储在数组或集合中,当需要时从池中获取,而不是每次需要时都新建。这样可以减少频繁的内存分配和垃圾回收。 2. **精灵表**:将多个小图像合并到一张大图(精灵表)中,通过坐标...

    AS3中的EVENT

    11. **事件池(Event Pool)**: 为了提高性能,AS3使用事件池来复用事件对象。当事件处理完成后,对象会被放回池中,而不是立即销毁。 12. **自定义事件**: 开发者可以创建自己的事件类,继承自`Event`,并添加额外的...

    flash塔防小游戏源码as3

    我们将从面向对象编程、源码结构以及关键组件等方面展开讨论,旨在为读者提供一个全面了解和学习AS3塔防游戏开发的知识框架。 首先,让我们聚焦在"面向对象"这一核心概念上。AS3是ActionScript 3.0的简称,是Adobe ...

    AS3.O笔试题 2011年珠海某著名游戏公司面试题 FLASH开发试题

    - 使用共享对象池减少内存开销。 - 使用Vector类代替Array,因为Vector是类型安全的,运行时性能更好。 - 缩减影片剪辑和显示对象的数量,合并图形。 - 利用事件监听器管理,避免内存泄漏。 - 优化网络请求,如...

    AS3加载外部资源(资源管理器)

    在ActionScript 3 (AS3)中,加载外部资源是创建动态、交互式内容的关键技能。资源管理器功能允许开发者高效地处理各种类型的媒体和数据,包括图片、SWF文件、声音、XML文档以及二进制文件。这些加载技术不仅提高了...

    基于as3.0小游戏

    10. **性能优化**:AS3.0小游戏需要考虑性能问题,例如减少不必要的计算、优化渲染过程、使用池技术管理对象等,以确保游戏在不同设备上流畅运行。 以上知识点是AS3.0小游戏开发的核心组成部分,通过学习和实践,...

    as3 烟花粒子测试

    6. **优化**:大量的粒子可能导致性能问题,通过使用对象池或者限制同时存在的粒子数量可以优化性能。 7. **动画帧率控制**:调整动画帧率来平衡视觉效果和性能。 8. **用户交互**:如果允许的话,可以添加用户...

Global site tag (gtag.js) - Google Analytics