游戏设计模式阅读笔记19——优化模式(空间分区)
目录
一、意图
二、动机
三、空间分区
1.适用场景:
2.实例代码
四、注意
1.划分是层次的还是平面的?
2.划分依赖于对象数量吗?
空间分区 · Optimization Patterns · 游戏设计模式
一、意图
将对象根据它们的位置存储在数据结构中,来高效地定位对象。
二、动机
在实施战略游戏中。双方有成百上千的单位在战场上撞在一起。战士自动向离他最近的敌人挥刀。最简单的处理就是遍历所有敌人。
如果使用最简单的循环,时间复杂度为单位数量的平方级。
这里想到最直接的优化就是使用时间复杂度更小的循环。但这样我们可能需要提前处理一下数据。比如:将二维坐标视为一维的战线。
这样就可以根据单位在战线上的位置排序数组元素来简化。并使用二分查找之类来降低时间复杂度。
三、空间分区
对于一系列对象,每个对象都有空间上的位置。将他们存储在根据位置组织对象的空间数据结构中,让你有效查询在某处或者某处附近的对象。当对象的位置改变时,更新空间数据结构。
1.适用场景:
这是存储活跃的、移动的游戏对象的常用模式。也可用于静态美术和世界地理。
基本要求是:有很多有位置的对象,并且做了太多通过位置查找对象造成性能下降。
同时,这是以空间换时间,并需要在对象位置改变时花费时间去维护这个新的列表。所以一定是在基数足够多,且时间比内存更短缺才能使用。
2.实例代码
空间分区的应用很灵活,这里介绍最简单的空间分区:固定网格
比如:将战场分割成一个个格子,每个士兵都处于某个格子中。
基础类:
这里的grid指针就是指向每个单位所在的格子的。
网格类:
将对象组织为双向链表,一个格子中的对象就有了相互关系
双向链表的具体管理
注意看这个add函数,总是保存了最后进这个格子的单位,新单位进来后就与这个单位互相链上。
于是,战场找人就优化到了每个格子找人。这里是以位置相同的逻辑在找。如果是需要按距离最近找,就需要对比周围的8个格子一起。
四、注意
空间划分通常为了配合四叉树和二分空间查找之类的。熟悉他们的工作原理,能更利于使用这个模式。
1.划分是层次的还是平面的?
i.平面
更简单,内存使用量确定,在对象改变位置时更新更快。
ii.层次性
能更有效率地处理空的区域。它处理密集空间更有效率。
2.划分依赖于对象数量吗?
i.与对象无关
在上面的示例中,如果所有的战士都挤在一个格子里,那性能就回到了优化前了。
ii.与对象数量有关
比如BSPs和K-D树,需要让每部分都接近相同数目对象。
iii.如果划分与对象无关,但层次与对象有关
比如四叉树,四叉树开始时将整个空间视为单一的划分。 如果空间中对象数目超 过了临界值,它将其切为四小块。
游戏设计模式阅读笔记19——优化模式(空间分区)相关推荐
- 游戏设计模式阅读笔记18——优化模式(对象池模式)
目录 一.意图 二.动机 三.对象池模式 四.实例代码 五.注意 1.对象和池耦合的问题 一.意图 放弃单独地分配和释放对象,从固定的池中重用对象,以提高性能和内存使用率. 二.动机 比如粒子系统的调 ...
- 游戏设计模式阅读笔记13——解耦模式(组件模式)
一.意图 允许单一实体跨越多个领域而不会导致这些领域彼此耦合. 二.动机 当一个系统涉及到渲染,物理,声音,控制器输入等等...如果都写在一个类中,这个类就显得巨大且不易维护添加,高度耦合. 在使用并 ...
- 游戏设计模式阅读笔记11——行为模式(子类沙箱)
目录 一.意图 二.动机 三.子类沙箱 1.适用场景: 2.缺点: 3. 优化: 4.可不写入基类的操作 子类沙箱是一种软模式,它表述了一个基本思路,但没有很多细节机制. 一.意图 用一系列由基类提供 ...
- 游戏设计模式阅读笔记4——重访设计模式(原型模式)
目录 1.<圣铠传说>例子 2.原型语言范式 现在有很多原型的术语,这里讨论的是传统的原型设计模式. 1.<圣铠传说>例子 但这种会产生众多的类,众多的引用,众多冗余,众多的副 ...
- Head First设计模式(阅读笔记)-04.工厂模式
披萨订购 假设要完成披萨订购的功能,披萨的种类很多,比如 GreekPizz.CheesePizz 等,披萨店会根据用户需要的披萨种类制作披萨,制作的流程包括prepare->bake-> ...
- 游戏设计模式阅读笔记8——序列模式(游戏循环)
目录 一.意图 二.动机 三.游戏循环 四.实例代码 1.能跑多快跑多快 2.休息一下 3.可以走一小步,也可以走一大步 4.固定时间刷新 五.目前的游戏循环 六.用电量相关 七.总结 1.固定时间步 ...
- 设计模式学习笔记——备忘录(Memento)模式
设计模式学习笔记--备忘录(Memento)模式 @(设计模式)[设计模式, 备忘录模式, memento] 设计模式学习笔记备忘录Memento模式 基本介绍 备忘录案例 类图 实现代码 Memen ...
- 设计模式学习笔记——状态(State)模式框架
设计模式学习笔记--状态(State)模式框架 @(设计模式)[设计模式, 状态模式, State] 设计模式学习笔记状态State模式框架 基本介绍 状态案例 类图 实现代码 State接口 Day ...
- 设计模式学习笔记——策略(Strategy)模式
设计模式学习笔记--策略(Strategy)模式 @(设计模式)[设计模式, 策略模式, Stategy] 设计模式学习笔记策略Strategy模式 基本介绍 策略案例 类图 实现代码 Hand类 S ...
最新文章
- c# 修饰词public, protected, private,internal,protected的区别
- 用C/C++编写window服务
- Kanas.net Framework 入门介绍
- PHP与Javascript的混合测试
- 网传铁饭碗职业排名,公务员仅排第八!
- 在线考试系统毕业设计设计过程及部分代码
- plc编程不是c语言,PLC编程中的五个常见问题
- 信道估计的理解(转载借鉴)
- 爬虫 第七讲 MongoDB
- python豆瓣电影需研究的问题_Python自定义豆瓣电影种类,排行,点评的爬取与存储(进阶下)...
- Room cannot verify the data integrity. Looks like you‘ve changed schema but forgot to update the ve
- PgAdmin中的数据库查询功能
- 预训练权重到底是个啥
- GO语言基础----简易计算器
- c语言---图形打印
- 服务器cpu性能最大值,服务器cpu性能排行
- 北京市政交通一卡通使用范围
- idea的java类图标C不见,取而代之是J标识,且写代码无提示。
- 关于计算机应用英语作文,计算机应用与办公自动化专业英文简历模板
- 鼎信诺服务器取数不显示账套,鼎信诺审计前端取数.doc
热门文章
- 移动端适配多种方案详细分析
- readxl包导入excel报错Error: `path` does not exist解决方法
- 从无到有完整搭建lnmp+redis+memcache+gearmand网站
- Flexpoint: An Adaptive Numerical Format for Efficient Training of Deep Neural Networks:弯曲点:一种有效训练深度神
- 从图形到像素:前端图形编程技术概览
- UIView的animateWithDuration动画不执行问题
- Angularjs兼容低版本IE
- 围棋博弈程序的实现与思考(4)——棋盘的数据结构
- 银河麒麟连不上网怎么办
- html页面虚化,css实现背景虚化效果的示例代码