目录

一、意图

二、动机

三、空间分区

1.适用场景:

2.实例代码

四、注意

1.划分是层次的还是平面的?

2.划分依赖于对象数量吗?


空间分区 · Optimization Patterns · 游戏设计模式

一、意图

将对象根据它们的位置存储在数据结构中,来高效地定位对象。

二、动机

在实施战略游戏中。双方有成百上千的单位在战场上撞在一起。战士自动向离他最近的敌人挥刀。最简单的处理就是遍历所有敌人。

如果使用最简单的循环,时间复杂度为单位数量的平方级。

这里想到最直接的优化就是使用时间复杂度更小的循环。但这样我们可能需要提前处理一下数据。比如:将二维坐标视为一维的战线。

这样就可以根据单位在战线上的位置排序数组元素来简化。并使用二分查找之类来降低时间复杂度。

三、空间分区

对于一系列对象,每个对象都有空间上的位置。将他们存储在根据位置组织对象的空间数据结构中,让你有效查询在某处或者某处附近的对象。当对象的位置改变时,更新空间数据结构。

1.适用场景:

这是存储活跃的、移动的游戏对象的常用模式。也可用于静态美术和世界地理。

基本要求是:有很多有位置的对象,并且做了太多通过位置查找对象造成性能下降。

同时,这是以空间换时间,并需要在对象位置改变时花费时间去维护这个新的列表。所以一定是在基数足够多,且时间比内存更短缺才能使用。

2.实例代码

空间分区的应用很灵活,这里介绍最简单的空间分区:固定网格

比如:将战场分割成一个个格子,每个士兵都处于某个格子中。

基础类:

这里的grid指针就是指向每个单位所在的格子的。

网格类:

将对象组织为双向链表,一个格子中的对象就有了相互关系

双向链表的具体管理

注意看这个add函数,总是保存了最后进这个格子的单位,新单位进来后就与这个单位互相链上。

于是,战场找人就优化到了每个格子找人。这里是以位置相同的逻辑在找。如果是需要按距离最近找,就需要对比周围的8个格子一起。

四、注意

空间划分通常为了配合四叉树和二分空间查找之类的。熟悉他们的工作原理,能更利于使用这个模式。

1.划分是层次的还是平面的?

i.平面

更简单,内存使用量确定,在对象改变位置时更新更快。

ii.层次性

能更有效率地处理空的区域。它处理密集空间更有效率。

2.划分依赖于对象数量吗?

i.与对象无关

在上面的示例中,如果所有的战士都挤在一个格子里,那性能就回到了优化前了。

ii.与对象数量有关

比如BSPs和K-D树,需要让每部分都接近相同数目对象。

iii.如果划分与对象无关,但层次与对象有关

比如四叉树,四叉树开始时将整个空间视为单一的划分。 如果空间中对象数目超                 过了临界值,它将其切为四小块。

游戏设计模式阅读笔记19——优化模式(空间分区)相关推荐

  1. 游戏设计模式阅读笔记18——优化模式(对象池模式)

    目录 一.意图 二.动机 三.对象池模式 四.实例代码 五.注意 1.对象和池耦合的问题 一.意图 放弃单独地分配和释放对象,从固定的池中重用对象,以提高性能和内存使用率. 二.动机 比如粒子系统的调 ...

  2. 游戏设计模式阅读笔记13——解耦模式(组件模式)

    一.意图 允许单一实体跨越多个领域而不会导致这些领域彼此耦合. 二.动机 当一个系统涉及到渲染,物理,声音,控制器输入等等...如果都写在一个类中,这个类就显得巨大且不易维护添加,高度耦合. 在使用并 ...

  3. 游戏设计模式阅读笔记11——行为模式(子类沙箱)

    目录 一.意图 二.动机 三.子类沙箱 1.适用场景: 2.缺点: 3. 优化: 4.可不写入基类的操作 子类沙箱是一种软模式,它表述了一个基本思路,但没有很多细节机制. 一.意图 用一系列由基类提供 ...

  4. 游戏设计模式阅读笔记4——重访设计模式(原型模式)

    目录 1.<圣铠传说>例子 2.原型语言范式 现在有很多原型的术语,这里讨论的是传统的原型设计模式. 1.<圣铠传说>例子 但这种会产生众多的类,众多的引用,众多冗余,众多的副 ...

  5. Head First设计模式(阅读笔记)-04.工厂模式

    披萨订购 假设要完成披萨订购的功能,披萨的种类很多,比如 GreekPizz.CheesePizz 等,披萨店会根据用户需要的披萨种类制作披萨,制作的流程包括prepare->bake-> ...

  6. 游戏设计模式阅读笔记8——序列模式(游戏循环)

    目录 一.意图 二.动机 三.游戏循环 四.实例代码 1.能跑多快跑多快 2.休息一下 3.可以走一小步,也可以走一大步 4.固定时间刷新 五.目前的游戏循环 六.用电量相关 七.总结 1.固定时间步 ...

  7. 设计模式学习笔记——备忘录(Memento)模式

    设计模式学习笔记--备忘录(Memento)模式 @(设计模式)[设计模式, 备忘录模式, memento] 设计模式学习笔记备忘录Memento模式 基本介绍 备忘录案例 类图 实现代码 Memen ...

  8. 设计模式学习笔记——状态(State)模式框架

    设计模式学习笔记--状态(State)模式框架 @(设计模式)[设计模式, 状态模式, State] 设计模式学习笔记状态State模式框架 基本介绍 状态案例 类图 实现代码 State接口 Day ...

  9. 设计模式学习笔记——策略(Strategy)模式

    设计模式学习笔记--策略(Strategy)模式 @(设计模式)[设计模式, 策略模式, Stategy] 设计模式学习笔记策略Strategy模式 基本介绍 策略案例 类图 实现代码 Hand类 S ...

最新文章

  1. c# 修饰词public, protected, private,internal,protected的区别
  2. 用C/C++编写window服务
  3. Kanas.net Framework 入门介绍
  4. PHP与Javascript的混合测试
  5. 网传铁饭碗职业排名,公务员仅排第八!
  6. 在线考试系统毕业设计设计过程及部分代码
  7. plc编程不是c语言,PLC编程中的五个常见问题
  8. 信道估计的理解(转载借鉴)
  9. 爬虫 第七讲 MongoDB
  10. python豆瓣电影需研究的问题_Python自定义豆瓣电影种类,排行,点评的爬取与存储(进阶下)...
  11. Room cannot verify the data integrity. Looks like you‘ve changed schema but forgot to update the ve
  12. PgAdmin中的数据库查询功能
  13. 预训练权重到底是个啥
  14. GO语言基础----简易计算器
  15. c语言---图形打印
  16. 服务器cpu性能最大值,服务器cpu性能排行
  17. 北京市政交通一卡通使用范围
  18. idea的java类图标C不见,取而代之是J标识,且写代码无提示。
  19. 关于计算机应用英语作文,计算机应用与办公自动化专业英文简历模板
  20. 鼎信诺服务器取数不显示账套,鼎信诺审计前端取数.doc

热门文章

  1. 移动端适配多种方案详细分析
  2. readxl包导入excel报错Error: `path` does not exist解决方法
  3. 从无到有完整搭建lnmp+redis+memcache+gearmand网站
  4. Flexpoint: An Adaptive Numerical Format for Efficient Training of Deep Neural Networks:弯曲点:一种有效训练深度神
  5. 从图形到像素:前端图形编程技术概览
  6. UIView的animateWithDuration动画不执行问题
  7. Angularjs兼容低版本IE
  8. 围棋博弈程序的实现与思考(4)——棋盘的数据结构
  9. 银河麒麟连不上网怎么办
  10. html页面虚化,css实现背景虚化效果的示例代码