关于对象池技术的讨论

一 某些游戏,希望减少那些频繁使用的对象的重复创建和销毁,原因是创建和销毁的操作一般消耗比较大,而且会造成很多的内存碎片。

二 应用例子:捕鱼类的鱼类,飞机类游戏的×××,rpg游戏的地图,数据库连接、网络套接字连接、线程对象、诸如字体或位图等图像对象等。

三 设计一般如下:先创建一个对象池(数组),当需要一个对象的时候,先看对象池里面是否有可用对象,如果有,则拿来用,否则创建新的对象。当对象用完之后,需要放回对象池中。因为系统资源有限,所以一般需要指定对象池可容纳对象的最大数量。当对象数量已经达到最大,如果仍有创建请求,则需要抛出异常或者阻塞当前调用进程,直到有对象放回对象池。

四 具体代码实现(网上一般有以下写法,一般有get对象方法和recyle对象方法):1. 一开始不把全部对象创建出来,需要用的时候,先看下池中有没有,如果有,则从数组开头拿一个出来用,否则,就new一个。回收的时候,对象要做一些必要的清理操作(对于某些语言,如果它们包含对其他对象的引用,它将阻止收集器再次收回它们),然后push回数组。2.一开始就把所有的对象都new出来,每个对象有一个是否正在使用的便签位,放到数组里面。需要用对象的时候,则遍历数组,如果找到一个没有使用的对象,则返回,否则,抛出异常或者阻塞当前的进程。回收的时候,对象要做一些必要的清理操作(对于某些语言,如果它们包含对其他对象的引用,它将阻止收集器再次收回它们),并且将便签位设置为未使用。

五 其他的讨论:很难正确的设定对象池的大小, 如果太小则起不到作用, 如果过大, 则占用内存资源高, 可以起一个线程定期扫描分析, 将池压缩到一个合适的尺寸以节约内存,但为了获得不错的分析结果, 在扫描期间可能需要暂停复用以避免干扰(造成效率低下), 或者使用非常复杂的算法策略(增加维护难度)。

六 最后要注意的是,并非任何情况下都适合采用对象池技术。基本上,只在重复生成某种对象的操作成为影响性能的关键因素的时候,才适合采用对象池技术。而如果进行池化所能带来的性能提高并不重要的话,还是不采用对象池化技术为佳,以保持代码的简明。

七 代码可从网上搜索,这里从略。

转载于:https://blog.51cto.com/zhangzhao/2369684

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值