游戏设计模式阅读笔记18——优化模式(对象池模式)
目录
一、意图
二、动机
三、对象池模式
四、实例代码
五、注意
1.对象和池耦合的问题
一、意图
放弃单独地分配和释放对象,从固定的池中重用对象,以提高性能和内存使用率。
二、动机
比如粒子系统的调用,系统需要快速地生成成百上千个粒子。还需要保证创建和销毁这些粒子不会造成内存碎片。
为游戏主机或者移动设备编程在许多方面比为普通计算机编程更像是嵌入式编程。内存紧张,压缩内存的管理器很难有效。在这种环境下,内存碎片是致命的。
碎片意味着在堆中的空余空间被打碎成了很多小的内存碎片,我不是大的连续内存块。总共的可用内存也许很大,但是最长的连续空间可能难以忍受地小。
一个简单又有效的方法:在游戏开始时取一大块内存,然后直到游戏结束才去释放它。但是这要在游戏运行时创建和销毁事物的系统是不友好的。
使用对象池,就需要将一大块内存分出来,保持在游戏运行时不释放它。对于池中的对象的管理可以简单的构造和析构。
三、对象池模式
定义一个池对象,其包含一组可重用对象。其中每个可重用对象都支持查询其状态,是否在被使用。池被初始化时,就创建了整个对象集合(通常使用一次连续的分配)。
需要新对象,池子会返回一个不在使用中的对象,并改变其状态。
1.适用场景
1.需要频繁创建和销毁对象
2.对象大小相仿
3.在堆上进行对象内存分配十分缓慢或者会导致内存碎片
4.每个对象都封装了像数据库或者网络连接这样昂贵又可以重用的资源。
2.池中对象都被使用,无法在创建的解决办法
1.增加池子大小。根据每个游戏场景需求和游戏内存来定。
2.不创建新的对象。对于不重要的对象,或者不明显的对象可以考虑不再创建。
3.强制干掉一个已有的对象。
每个对象的内存大小是固定的。如果你的对象是大小可变的,你可以再将池子分成大小不同的池,大箱子给大行李,小箱子给小行李。
重用对象不会自动清除数据,保证初始化代码将完全的初始化所有的数据。在池中对象不再使用后,需要清除它对其他对象的所有引用。
四、实例代码
创建一个粒子系统的对象池
对象池中有一个固定大小的数组。也可以使用动态大小的数组或使用由外部定义的模板变量。animate是粒子系统播放的函数。
创建新粒子:
找到可用粒子就返回,没有就不创建新的粒子。
如果不想浪费时间查找空闲粒子。可以使用列表来管理他们。但这样就多了一个对象池同样大小的单独数组。
或者通过修改粒子系统类:
这里framesLeft表示粒子的状态,union的部分都是可重用的。next指针指向下一个未使用的粒子。 这个方法叫做freelist。unions的内存优化涉及到位压缩技术。
freelist的对象池:
追踪列表的头指针。
首次创建需要构建整个链表。
233333333可爱的作者,爱了爱了
在粒子使用完后,管理状态。
状态变化后放回空闲列表中。
五、注意
1.对象和池耦合的问题
1.对象与池耦合
实现更简单。能保证对象只能被对象池创建。C++中,就让池对象是对象类的友类,将对象的构造器设为私有。
2.对象没有和池耦合
可以保存多种类型的对象。必须在对象的外部追踪“使用中”状态。
游戏设计模式阅读笔记18——优化模式(对象池模式)相关推荐
- 游戏设计模式阅读笔记19——优化模式(空间分区)
目录 一.意图 二.动机 三.空间分区 1.适用场景: 2.实例代码 四.注意 1.划分是层次的还是平面的? 2.划分依赖于对象数量吗? 空间分区 · Optimization Patterns · ...
- 游戏设计模式阅读笔记4——重访设计模式(原型模式)
目录 1.<圣铠传说>例子 2.原型语言范式 现在有很多原型的术语,这里讨论的是传统的原型设计模式. 1.<圣铠传说>例子 但这种会产生众多的类,众多的引用,众多冗余,众多的副 ...
- 游戏设计模式阅读笔记13——解耦模式(组件模式)
一.意图 允许单一实体跨越多个领域而不会导致这些领域彼此耦合. 二.动机 当一个系统涉及到渲染,物理,声音,控制器输入等等...如果都写在一个类中,这个类就显得巨大且不易维护添加,高度耦合. 在使用并 ...
- 游戏设计模式阅读笔记11——行为模式(子类沙箱)
目录 一.意图 二.动机 三.子类沙箱 1.适用场景: 2.缺点: 3. 优化: 4.可不写入基类的操作 子类沙箱是一种软模式,它表述了一个基本思路,但没有很多细节机制. 一.意图 用一系列由基类提供 ...
- 游戏设计模式阅读笔记8——序列模式(游戏循环)
目录 一.意图 二.动机 三.游戏循环 四.实例代码 1.能跑多快跑多快 2.休息一下 3.可以走一小步,也可以走一大步 4.固定时间刷新 五.目前的游戏循环 六.用电量相关 七.总结 1.固定时间步 ...
- 设计模式之对象池模式
对象池模式 对象池模式, 或者称为对象池服务, 其意图为: 通过循环使用对象, 减少资源在初始化和释放时的昂贵损耗(这里的"昂贵"可能是时间效益(如性能), 也可能是空间效益(如并 ...
- 设计模式学习笔记(十七)——Command命令模式
设计模式学习笔记(十七)--Command命令模式 Command命令模式介绍: Command命令模式是一种对象行为型模式,它主要解决的问题是:在软件构建过程中,"行为请求者"与 ...
- 设计模式学习笔记——责任链(Chain of Responsibility)模式
设计模式学习笔记--责任链(Chain of Responsibility)模式 @(设计模式)[设计模式, 责任链模式, chain of responsibility] 设计模式学习笔记责任链Ch ...
- unity 对象池模式
1.理解 对象池用于减少内存开销,其原理就是把可能用到到的对象,先存在一个地方(池),要用的时候就调出来,不用就放回去.而不是要用的时候创建,不用的时候销毁. Eg: 我有个飞机,射击子弹,按传统的方 ...
最新文章
- linux 使用 C 语言获得系统 MAC 地址
- redis持久化存储AOF与RDB
- python:将时间戳转换成格式化日期
- Android使用webview控件加载本地html,通过Js与后台Java实现数据的传递
- java lambda表达式详解_Lambda表达式详解
- 工作流实战_05_flowable 流程定义的挂起与激活
- java栈的应用_Java堆栈应用程序
- mysql配置master_mysql 主从配置(master/slave)
- 物联网时代如何保障数据安全
- python生成器详解
- webp格式图片如何简单快速转换成JPG、PNG格式
- 手把手教你写电商爬虫-第一课 找个软柿子捏捏
- 依赖计算机英语作文,过度依赖电脑的危害的英文作文
- kinect相机的安装环境搭建以及测试
- MySQL 必知必会系列(五)
- android 水印视频教程,如何给视频添加一个摇摆的文字水印?安卓手机视频编辑助手app给视频加文字水印...
- 内网异地备份_用批处理实现局域网内的异地备份
- 校招选择题汇总【图形推理(1)】含答案解析
- 计算机技术与移动支付的关系,移动支付的破与立
- 物联卡中心:物联卡是正规卡吗?与流量卡有什么区别?