- 浏览: 108239 次
- 性别:
- 来自: 广州
文章分类
最新评论
为什么使用对象池?
我们先来看一个例子:假设游戏当中,玩家按下鼠标,那么游戏场景中出现一个美女A,代码是var A:美女A=new 美女A();addChild(A); 放开鼠标美女被清除,代码是:A.dispose();A=null;如果某个玩家不停地点击鼠标,那么我们的代码将不停的NEW 美女A()而NEW 美女A()其实是很费时消耗系统性能这是问题就来了,假设NEW 美女A()消耗了2KB内存,玩家疯狂点一千次,那么我们的美女类就不断地创建,清除,创建,清除,那么我们的游戏内存直接增加1000*2kb,因为 FLASH是托管的GC清理资源,具体什么时候清理只有GC知道,那么我们的游戏的性能就………可是如果我们有了对象池那又是一种什么情况 呢?首先美女将被new 美女A() 然后美女A被放入到对象池中存放,当鼠标按下的时候我们将执行:ObjectPool. borrowObject():取得美女A,当鼠标按下我们执行 ObjectPool.returnObject():这样子美女又被放入到对象池中存起来了,执行一千次,由于使用对象池取得美女A和放入美女A中不涉 及到对象的创建和销毁,所以我们的游戏不会导致系统资源的增加。因为美女A被访到内存池中存储起来重复利用了。
了解对象池
对象池的工作原理:
对象池的工作原理的核心有两点:使用和缓存,即对于那些被频繁使用的对象,在使用完后,不立即将它们释放,而是将它们缓存起来,以供后续的应用程序重复使 用,从而减少创建对象和释放对象的次数,进而改善应用程序的性能。
优点:能快速取出对象节省了NEW对象所产生的cpu,时间的消耗。能很好的控制内存的占用,使用时从对象池取出,使用完毕放回。中间不涉及到对象 销毁创建,所以内存占用是定量的。同时如果对象池提前
缺点:对象池同样消耗new同样对象所消耗的时间,对象池从创建到结束消耗定量的内存。对象池只适合大量的对象需要被重复创建使用销毁创建使用销毁 的情况。非提前初始化式内存池,缓存as值类型的对象如:Point反而产生更大的消耗。
package { import flash.utils.Dictionary; import flash.utils.getDefinitionByName; import flash.utils.getQualifiedClassName; /** * 用于显示对象的对象池类 */ public class DisplayObjectPool { private static var instance:DisplayObjectPool; /** * 作为对象池的词典dict */ private var objPoolDict:Dictionary = new Dictionary ; public function DisplayObjectPool() { } public static function getInstance():DisplayObjectPool { if (instance == null) { instance = new DisplayObjectPool ; } return instance; } /** * 向对象池中放入对象,以便重复利用 * @param disObj 要的放入对象 */ public function push(oldObj:Object):void { var objName:String = getQualifiedClassName(oldObj); if (oldObj == null) { return; } if (this.objPoolDict[objName] == null) { this.objPoolDict[objName] = []; } this.objPoolDict[objName].push(oldObj); } /** * 从对象池中取出需要的对象 * @param targetObj 需要的对象类类名,没必要必须是类实例名 类名就可以 * @return 取出的相应对象 * */ public function pop(targetObj:Object):Object { var objName:String = getQualifiedClassName(targetObj); trace(objName); if (this.objPoolDict[objName] != null && this.objPoolDict[objName].length > 0) { return this.objPoolDict[objName].pop() as Object; } var objClass:Class = getDefinitionByName(objName) as Class; var obj:Object = new objClass as Object; return obj; } } }
发表评论
-
AS3动态获得类名及类的方法
2012-10-26 17:53 18001.获得某个实例对象的类名:getQualifiedClass ... -
Vector初始化的各种写法
2012-10-16 14:56 4847var i:int = 0; var j:int = ... -
as3中数组array与vector的区别
2012-10-15 14:47 1498ActionScript 3.0 中可用的另一种索引数组 ... -
关于ADDED_TO_STAGE事件
2012-08-13 16:37 810在将显示对象直接添加到舞台显示列表或将包含显示对象的子树 ... -
关于读取舞台大小各浏览器之间的差异
2012-08-13 16:38 793因为在做项目的时候遇到的怪异问题 ie下的player会sta ... -
Flash-如何改变动态文本透明度
2012-08-13 16:39 1713因为Flash的系统字体不直接支持透明,所以我们得通过嵌 ... -
教你如何修改FLASH右键菜单
2012-08-14 15:36 2258有些东西只有用到了才会去看,才会去寻找答案。这真的挺有道 ... -
as跨域问题解决总结
2012-08-14 15:36 1619总结一下在工作中遇 ... -
AS3参数的传址与传值
2012-08-14 15:37 1187//as3里面规定,属于基元数据类型(包括 Boolea ... -
AS3 数组深度复制
2012-08-15 09:55 832//简单复制后,修改副本会修改原对象,深度复制后,修改副 ... -
自定义异常类
2012-08-10 15:19 884package { import flash.err ... -
hasEventListener()与willTrigger()区别
2012-08-10 15:17 1291hasEventListener()方法: 检查 Ev ... -
写AS3需要养成好的编码习惯
2012-08-10 15:14 869因为AS3的垃圾回收是自动的,如果你某个对象存在被引用, ... -
as3 代码优化
2012-08-10 14:41 1484var obj:Object = {}; 比 var obj: ... -
AS3 复制可视对象
2012-08-09 16:44 1244复制舞台上的影片剪 反射方法: 需要复制的舞台对象 ... -
AS3动态获得类名及类的方法
2012-08-09 16:21 8131.获得某个实例对象的类名:getQualifiedClass ... -
Flash流式视频提示点及回调函数
2012-08-09 16:21 1482流式传输视频文件 若要流式传输 Flash Media Se ... -
深度探索as3的事件机制
2012-08-08 11:57 1858as3的事件机制很好用 ... -
AS3数组转换XML
2012-08-08 11:08 928package { import flash.displa ... -
FLASH自定义组件
2012-08-08 10:43 2119由于工作需要,最近开始学习FLASH自定义组件的开发。在开发过 ...
相关推荐
在ActionScript 3(AS3)中,由于其基于ECMAScript的特性,对象创建和销毁可能会导致一定的性能影响,因此对象池模式的应用尤为必要。 接下来,我们将探讨如何用AS3实现对象缓存池。首先,我们需要定义一个基类或...
在AS3这样的环境中,正确地应用对象池和工厂方法,能够显著改善程序性能,尤其在需要频繁创建和销毁对象的场景下。文件“com”可能是源代码的一部分,包含有关对象池实现的具体细节,进一步分析这些源码可以帮助我们...
7. **优化技巧**:为了确保在Web上流畅运行,可能涉及到一些优化技术,比如批次渲染、对象池管理、内存管理和性能监控。 学习这些源码可以帮助开发者深入了解AS3的3D编程,提高他们的技能,并能应用于实际项目,...
位运算可以提高计算速度,对象池则能减少频繁创建和销毁对象带来的开销。 八、网络通信算法 AS3中的Socket和URLLoader类支持网络通信。TCP和UDP协议、HTTP和FTP请求,以及JSON或XML数据交换都是页游网络通信的基础...
10. **对象池**:对象池是一种优化技术,用于复用游戏对象,避免频繁创建和销毁对象带来的性能开销。 在学习这个“简单游戏框架”时,你可以通过分析源代码了解上述各个部分的实现方式,并尝试修改和扩展它以适应...
在AS3中,可以使用弱引用和池技术来实现。 8. 装饰模式(Decorator):动态地给一个对象添加一些额外的职责。AS3中的DisplayObjectContainer类可以添加多个子对象,实现装饰功能。 9. 外观模式(Facade):为子...
7. **代码优化**:常见的优化策略包括使用位运算代替浮点计算、避免不必要的对象创建、使用共享对象池、以及利用DisplayObject的cacheAsBitmap属性提高渲染效率。 8. **性能分析工具**:除了内置的性能输出窗口,...
6. **对象池和性能优化**:为了提高性能,可以考虑使用对象池来复用图形对象,避免频繁创建和销毁导致的内存开销。同时,通过合理地缓存和复用矩阵、图形数据,也能提升动画的流畅度。 7. **编程技巧**:最后,良好...
AS3(ActionScript 3)是Adobe Flash Professional和Flex Builder等开发工具中使用的主要编程语言,用于创建交互式内容、游戏和应用程序。在这个特定的项目中,“as3 抽奖小程序(图片)”是一个基于AS3编写的抽奖...
对于大资源的缓存,你可能需要自定义解决方案,比如使用内存对象池或者将资源分解成更小的部分来加载和缓存。 在白鹭引擎中,`RES`模块提供了一个完整的资源管理解决方案,包括预加载、缓存、按需加载等功能。如果...
11. **事件池(Event Pool)**: 为了提高性能,AS3使用事件池来复用事件对象。当事件处理完成后,对象会被放回池中,而不是立即销毁。 12. **自定义事件**: 开发者可以创建自己的事件类,继承自`Event`,并添加额外的...
总的来说,AS3塔防小游戏源码的学习,不仅能够帮助我们理解游戏开发的基本流程,还能深入理解面向对象编程在实际项目中的应用。通过分析和研究源码,我们可以从中汲取经验,提升自己的编程技能,甚至开发出更具创新...
1. **对象池**:预先创建一组对象并存储在数组或集合中,当需要时从池中获取,而不是每次需要时都新建。这样可以减少频繁的内存分配和垃圾回收。 2. **精灵表**:将多个小图像合并到一张大图(精灵表)中,通过坐标...
在ActionScript 3 (AS3)中,加载外部资源是创建动态、交互式内容的关键技能。资源管理器功能允许开发者高效地处理各种类型的媒体和数据,包括图片、SWF文件、声音、XML文档以及二进制文件。这些加载技术不仅提高了...
10. **性能优化**:AS3.0小游戏需要考虑性能问题,例如减少不必要的计算、优化渲染过程、使用池技术管理对象等,以确保游戏在不同设备上流畅运行。 以上知识点是AS3.0小游戏开发的核心组成部分,通过学习和实践,...
- 使用共享对象池减少内存开销。 - 使用Vector类代替Array,因为Vector是类型安全的,运行时性能更好。 - 缩减影片剪辑和显示对象的数量,合并图形。 - 利用事件监听器管理,避免内存泄漏。 - 优化网络请求,如...
6. **优化**:大量的粒子可能导致性能问题,通过使用对象池或者限制同时存在的粒子数量可以优化性能。 7. **动画帧率控制**:调整动画帧率来平衡视觉效果和性能。 8. **用户交互**:如果允许的话,可以添加用户...
9. **性能优化**:由于3D渲染对计算资源的需求较高,因此理解内存管理、对象池和批处理技术对于优化Away3D应用至关重要。 10. **3DParking实例**:根据提供的文件名,3DParking可能是示例项目,演示如何在Flex中...
5. **性能优化**:由于粒子系统可能会生成大量对象,因此源码可能包含了性能优化策略,如对象池技术,减少频繁创建和销毁对象带来的内存开销,以及适当的缓存机制,提高渲染效率。 6. **编程结构**:良好的编程结构...
7. **对象池**:为了优化性能,可能会使用对象池技术来复用游戏对象,如子弹和敌人,避免频繁创建和销毁对象。 8. **状态机**:游戏状态的管理可以使用状态机设计模式,如暂停、游戏结束、游戏进行等不同状态之间的...