另一个重要优化称为对象池,涉及到不断重复使用对象。在初始化应用程序期间创建一定数量的对象并将其存储在一个池中,例如 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代码实现对象缓存,对应频繁需要创建和销毁的对象,采用一个缓存队列,保存一定数量的对象,当需要的时候从队列里取出,不再需要的时候交给缓存池。
LoanShark 是一个灵活且高性能的对象池实用程序,用 AS3 编写。 它久经沙场,经过全面单元测试并积极维护。 如何使用它 对于构建繁重的自定义类特别有用,只需实例化 LoanShark 实例,传入您选择的类即可。 然后,您...
对上一个版本的对象池模块做了优化,提升性能,修改了明显的几处性能瓶颈。
如果我们在客户端频繁使用ajax技术,...建立一个保持xmlhttp实例的池,好处显而易见,最明显的优点就是我们不会创建冗余对象,同时也不会出现在同一个正在被调用的xmlhttp实例上出现再次被操作的情况。 具体实现思路
这些库为您提供了访问和修改虚拟对象,池和配置文件等配置对象的工具。 此tmsh脚本从现有虚拟服务器配置中生成JSON Blob。 然后,可以将JSON Blob馈送到AS3,以进行无标度的部署应用程序服务和/或添加到CI / CD...
allas是的连接池,仅支持LISTEN / NOTIFY。 这个想法是允许应用程序在事务池模式下使用pgbouncer,而仅通过allas接收通知。 allas仅使用单个PostgreSQL连接,并在该连接上适当地进行LISTENing和UNLISTENing的处理,...
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.使用...
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...
4.2.1 使用C#的is和as操作符来转型 4.3 命名空间和程序集 4.4 运行时的相互联系 第5章 基元类型、引用类型和值类型 5.1 编程语言的基元类型 5.1.1 checked和unchecked基元类型操作 5.2 引用类型和值类型 5.3...
//关闭存储对象的资源 ADOStoredProc.Close; finally //调用结束,释放资源 ADOObject.Free; end; end; procedure TForm2.FormCreate(Sender: TObject); var ADOConn:TADOConnection; begin (***********...
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特有...
4.2.1 使用C#的is和as操作符来转型 4.3 命名空间和程序集 4.4 运行时的相互联系 第5章 基元类型、引用类型和值类型 5.1 编程语言的基元类型 5.1.1 checked和unchecked基元类型操作 5.2 引用类型和值类型 5.3...
4.2.1 使用C#的is和as操作符来转型 4.3 命名空间和程序集 4.4 运行时的相互联系 第5章 基元类型、引用类型和值类型 5.1 编程语言的基元类型 5.1.1 checked和unchecked基元类型操作 5.2 引用类型和值类型 5.3...
转至文档类( AS3 ) 代理 - 配置您的浏览器使用我们的代理 - 代理嗅探http通讯和搜索SWF文件 - 找到SWF文件可以编辑的地方,然后通过代理再担当 搜寻记忆 - 搜索主权财富基金在其他进程的内存 搜索浏览器...
调用 servlet 时,它将创建一个代理对象池,并使用该池同时调用 JAX-WS 端点。 ###Building/Deploying 通过运行mvn install构建项目。 通过运行mvn jboss-as:deploy将项目部署到本地 JBoss。 ###运行测试使用 URL...