《游戏编程模式》记录

写在前面

  • 这本书长这样

  • 我还没有看过“GOF”,我所读到的设计模式都是这本书(游戏角度)给出的定义,害怕GOF中的定义过于抽象。
  • 没有在项目代码晃来晃去经历的,或者没有工作至少半年的,不用着急买这本书,因为估计看不懂。
  • 本文用来重点记录“我觉得XX设计模式是什么”,以及“当我在看XX设计模式时,我在想什么”
  • 这本书的写作方式,属于我喜欢的“谈话口吻”

命令模式

  • 书面定义:“将一个请求封装成一个对象,从而允许你使用不同的请求、队列或日志将客户端参数化,同时支持请求操作的撤销和恢复”
  • 他的举例:按键事件
  • 我的定义:将命令封装成对象,支持撤销和重做
  • 我的举例:(书上已然很好)
  • 想到的问题:
    • 举例用了按XX键执行YY事件,我以为它会讲自定义按键(就是跳是按A,现在我想跳是按B)……
    • 讲到非常具体的命令,它联系到了下一章的“享元模式”,旁注不让用“单例模式”,想想确实,因为单例模式根本不会有继承

享元模式

  • 书面定义:使用共享以高效地支持大量的细粒度对象
  • 他的举例:森林
  • 我的定义:将共同点分离出来,在另外加上具体点
  • 我的举例:(书上已然很好)
  • 想到的问题:
    • 我第一个想到的就是类的继承,不过文中的举例,都没有涉及到继承

观察者模式

  • 书面定义:“在对象间定义一种一对多的以来关系,以便当某对象的状态改变时,与它存在依赖关系的所有对象都能收到通知并自动进行更新”
  • 他的举例:成就系统
  • 我的定义: 当对象的状态改变时,通知给它所有的关注者
  • 我的举例:C#的event
  • 想到的问题:无

原型模式

  • 书面定义:“使用特定原型实例来创建特定种类的对象,并且通过拷贝原型来创建新的对象”
  • 他的举例:具体怪物生成器
  • 我的定义: (我没看懂它和前面的享元模式有什么不一样……)
  • 我的举例:(没想到……)
  • 想到的问题:(没想到……)

单例模式

  • 书面定义:“确保一个类只有一个实例,并为其提供一个全局访问入口”
  • 他的举例:文件系统
  • 我的定义: 无(书面定义已经很清楚)
  • 我的举例:常见的GameManager,AudioManager……
  • 想到的问题:单例初始化,是使用延迟初始化,但在我见过的项目中,都会放在游戏开始前初始化完

状态模式

  • 书面定义:“允许一个对象在其内部状态改变时改变自身的行为。对象看起来好像是在修改自身类”
  • 他的举例:玩家跑跳站躲行为
  • 我的定义:状态切换管理器
  • 我的举例:Unity里的状态机
  • 想到的问题:书中的状态举例从枚举升级成了类,从未来发展角度来看确实应该这样做;书中讲到的状态机的扩展(层次状态机,并发状态机)很有用

双缓存模式

  • 书面定义:无
  • 他的举例:计算机图形显示的双缓冲机制
  • 我的定义: 无
  • 我的举例:(书上已然很清楚)
  • 想到的问题:无(在用代码演示的时候,理解Update出了问题,只跑了一次,其实应该是不停跑Update的……)

游戏循环模式

  • 书面定义:“实现用户输入和处理器速度在游戏行进时间上的解耦”
  • 他的举例:如其名
  • 我的定义: 无
  • 我的举例:Unity游戏引擎
  • 想到的问题:无

更新方法模式

  • 书面定义:“通过对所有对象实例同时进行帧更新来模拟一系列相互独立的游戏对象”
  • 他的举例:给女武神准备的骷髅和喷火雕像
  • 我的定义: Update细分成若干个对象的Update
  • 我的举例:Unity中的Monobehaviour
  • 想到的问题:
    • 查资料(书上推荐的就是Unity官方文档的Update)时,重新看了一下Time.deltaTime的定义:当前帧和上一帧的时间间隔/上一帧用时。
    • 看了“游戏循环模式”对于体现“按帧进行”的阐述,对Time.deltaTime和Time.timeScale有了更深刻的印象。

字节码模式

  • 书面定义:“通过将行为编码成虚拟机指令,而使其具备数据的灵活性”
  • 他的举例:生成法术
  • 我的定义: 无
  • 我的举例:无
  • 想到的问题:
    • 文中后边举例提到了Lua(基于寄存器虚拟机);
    • 这一章更像是在讲编程语言课

子类沙盒模式

  • 书面定义:“使用基类提供的操作集合来定义子类中的行为”
  • 他的举例:超级英雄的能力细分
  • 我的定义: 基类里写好子类会用到的所有方法
  • 我的举例:无
  • 想到的问题:没看出来和前面的“享元模式”、“原型模式”有啥不同

类型对象模式

  • 书面定义:“通过创建一个类来支持新类型的灵活创建,其每一个实例都代表一个不同的对象类型”
  • 他的举例:巨魔的种类,不再时派生“怪物”类,而是派生“种类”类
  • 我的定义: 无
  • 我的举例:(没在实际中见过)
  • 想到的问题:这个模式好像是让写具体分类的工作还给策划而不是程序

组件模式

  • 书面定义:“允许一个单一的实体跨越多个不同域而不会导致耦合”
  • 他的举例:面包师类的内容分离过程
  • 我的定义: 负责一个功能的就分一个类
  • 我的举例:GameMangager就有NetManager,AudioManager……组成
  • 想到的问题:无

事件队列模式

  • 书面定义:“对消息或事件的发送与受理进行时间上的解耦”
  • 他的举例:Audio播放声音
  • 我的定义:观察者模式上,加入异步
  • 我的举例:无
  • 想到的问题:无(我还真没在项目中见过Audio放声是异步处理的)

服务定位器模式

  • 书面定义:“为某服务提供一个全局入口来避免使用者与该服务具体实现类之间产生耦合”
  • 他的举例:查找需要的Audio
  • 我的定义:单例模式的进化
  • 我的举例:无
  • 想到的问题:(提到了装饰器模式(仅在此处提到))

数据局部性模式

  • 书面定义:“通过合理组织数据利用CPU的缓存机制来加快内存的访问速度”
  • 他的举例:游戏更新中,不是更新实体数组,而是更新组件数组
  • 我的定义:无
  • 我的举例:无
  • 想到的问题:
    • 从缓存角度,来介绍这个模式;
    • 我第一眼以为是讲“数据结构(算法)”这种。
    • 还想到了“对象池”用Stack而不是List的组织。

脏标记模式

  • 书面定义:“讲工作推迟到必要时进行以避免不必要的工作”
  • 他的举例:父物体移动及其渲染
  • 我的定义:无
  • 我的举例:GC
  • 想到的问题:
    • 别人写的Unity自定义UI组件的渲染部分,有看到dirty

对象池模式

  • 书面定义:“使用固定的对象池重用对象,取代单独地分配和释放对象,以此来达到提升性能和优化内存使用的目的”
  • 他的举例:释放魔法时的粒子
  • 我的定义:无
  • 我的举例:无
  • 想到的问题:
    • 这是老师唯一教的一个设计模式,当时我还不知道它是一种设计模式
    • 书中,为了尽可能降低时间复杂度,设计的算法(基于链表),新鲜。

空间分区模式

  • 书面定义:“将对象存储在根据位置组织的数据结构中来高效地定位它们”
  • 他的举例:勇士攻击最近的敌人
  • 我的定义:无
  • 我的举例:无
  • 想到的问题:
    • 好像在看数据结构(算法)

原文地址:https://www.cnblogs.com/caiger-blog/p/11429136.html

时间: 2024-10-14 01:00:00

《游戏编程模式》记录的相关文章

Game Programming Patterns(游戏编程模式)-简介

游戏编程模式-简介 本系列博客是:Game Programming Patterns 的中文翻译版本. 翻译的github地址: cyh24. 如有兴趣,可联系博主共同翻译,一起造(wu)福(dao)他人. 博客虽然水分很足,但是也算是博主的苦劳了, 如需转载,请附上本文链接http://blog.csdn.net/cyh_24/article/details/46868419,不甚感激! 本系列博客 目录,可点击进入. 简介 ============================ 在我五年级

《游戏编程模式》(8)

<游戏编程模式>最后一篇,刚从英国玩了一圈,春节又要到啦 Chapter 19 对象池 使用固定的对象池重用对象,取代单独地分配和释放对象,达到提升性能和优化内存使用的目的. 使用情境: 频繁创建销毁对象: 对象大小基本一致: 堆上分配内存较慢或可能产生内存碎片: 粒子类: 用union节省内存:粒子使用时用live结构体,不使用时用next指针 1 class Particle 2 { 3 4 public: 5 Particle() 6 : framesLeft_(0) 7 {} 8 9

Game Programming Patterns(游戏编程模式)

Game Programming Patterns(游戏编程模式) 大部分游戏开发者在他们游戏项目上总是一个巨大的挑战,总是东拼西凑,修修补补.很多游戏项目常常以失败告终,或者是被淹没在复杂而繁琐的代码中.如何解决这些问题? 各位看官,不管你是对游戏开发感兴趣,或者正在饱受代码不断增长带来的灾难,这本书将是你们的福音! 这本Game Programming Patterns 是由Bob Nystrom(一位在EA待过7年,有着20年游戏开发经历的工程师编写).本书将告诉你,什么模式能够帮你理清和

【游戏设计模式】之四 《游戏编程模式》读书笔记:全书内容梗概总结

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/53240330 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 本文的Github版本:QianMo/Reading-Notes/<游戏编程模式>读书笔记 这是一篇超过万字读书笔记,总结了<游戏编程模式>一书中所有章节与内容的知识梗概. 我们知道,游戏行业其实一直很缺一本系

Game Programming Patterns(游戏编程模式)-架构,性能与游戏

游戏编程模式- 架构,性能与游戏 本系列博客是:Game Programming Patterns 的中文翻译版本. 翻译的github地址: cyh24. 如有兴趣,可联系博主共同翻译,一起造(wu)福(dao)他人. 博客虽然水分很足,但是也算是博主的苦劳了, 如需转载,请附上本文链接,不甚感激! 本系列博客 <游戏编程模式>– 目录,可点击进入. 架构,性能与游戏 ============================ 在我们埋头研究一堆的设计模式之前,我想先告诉你,对于软件架构,我个

游戏编程模式-事件队列

“对消息或事件的发送与受理进行事件上的解耦.” 动机 如果你曾从事过用户界面编程,那肯定对“事件”不陌生了.每当你在界面中点击一个按钮或下拉菜单,系统都会生成一个事件,系统会把这个事件抛给你的应用程序,你的任务就是获取到这些事件并将其与你自定义的行为关联起来.那么为了获取到这些事件,你的代码通常都会由个事件循环.就像这样: while(running) { Event e = pollEvent(); //handle event } 可以看到,这段代码会不断的获取事件,然后处理.但如果期间再事

游戏编程模式--单例模式

单例模式 定义:确保一个类只有一个实例,并为其提供一个全局的访问入口. 那么什么情况下使用单例?最常见的情况就是一个类需要与一个维持自身状态的外部系统进行交互,比如说打印机.大多数情况下都是多人共用一个打印机,这意味着可能由多个人同时向这个打印机发送打印任务,这个时候管理打印机的类就必须熟悉打印机的当前状态并协调这些任务的执行.这个时候就不允许存在多个打印机的实例,因为实例无法知道其他的实例所做的操作,也就无法进行整体的管理. 我们先看看最常见的单例的实现方式: class FileSystem

游戏编程模式-对象池

“使用固定的对象池重用对象,取代单独的分配和释放对象,以此来达到提升性能和优化内存使用的目的.” 动机 假设我们正在致力于游戏的视觉效果优化.当英雄释放魔法时,我们想让一个火花在屏幕上炸裂.这通常需要一个粒子系统(一个用来生成大量小的图形并在它们生存周期产生动画的引擎)来实现.而这个粒子系统实现这个火花的时候会产生大量的粒子,我们需要非常快速的创建这些粒子同时在这些粒子“死亡”的时候释放这些粒子对象.在这里,我们会碰到一个严重的问题——内存碎片化. 碎片化地害处 为游戏和移动设备编程在很多方面都

《游戏编程模式》(6)

Chapter 14 组件模式 允许一个单一的实体跨越多个不同域而不会导致耦合. 为实现两个类之间的代码共享,应该让他们拥有同一个类的实例,而不是继承同一个类. 使用情境: 有一个涉及多个域的类.但希望这些域保持解耦: 这个类很庞大: 希望定义许多共享不同能力的对象. 分割不同的域: 1 class InputComponent 2 { 3 4 public: 5 void update(Bjorn& bjorn) 6 { 7 switch (Controller::getJoystickDir