用一天时间读了一本书《游戏设计模式》,这是笔记。
基础设计模式
0、设计模式应用
除非确信代码必需存在灵活性,否则不要浪费时间用于抽象和解耦;
开发过程中对性能的思考和设计,要推迟那些降低灵活性、底层的、详尽的优化;
尽快探索设计空间,但不要太快成型,降低灵活扩展性;
以后要删除的代码不要浪费时间去整理得很整洁;
1、命令模式
把玩家和AI的指令做成命令流(用队列的方式),调用的时候只需要传入被控制角色参数即可——编程语言有闭包直接用闭包,没闭包建命令类
2、享元模式
将能够共享的数据(例如纹理),做成单独的类,用API调用,提供共享数据和使用数据的实例列表和实例的差异化参数来调用,相同实例只需创建一次,就能在多处使用(地形系统),常用于GPU渲染
3、观察者模式
发送消息通知对消息感兴趣的对象,不用关心谁接收到了通知(由外部代码控制谁接收通知)。观察者(例如成就系统的某一个成就)接收通知,被观察者(例如可被观察的物理模块)有一个观察者集合(如果需要在观察者类中添加状态,可以用链表),用于发送通知。C#中的event
4、原型模式
使用特定的原型实例来创建特定种类的对象,并通过拷贝原型来创建新的对象。常用于怪物生成等游戏数据建模任务
5、单例模式
确保一个类只有一个实例,并为其提供一个全局访问入口
6、状态模式
允许一个对象在其内部状态改变时改变自身的行为,对象看起来好像是在修改自身类(有限状态机、并发状态机、层次状态机、下推自动机),常用于处理射击游戏主角的状态、游戏AI(行为树和规划系统)等
序列型模式
1、双缓冲模式
用于解决状态在被修改的同时被读取的问题(周期性地交换两个缓冲区的引用)
2、游戏循环模式
实现用户输入和处理器速度在游戏进行时间上的解耦
3、更新方法模式
一系列几乎是相互独立的游戏对象需要同步运转,对象的行为与时间相关时用
行为型模式
1、字节码
游戏引擎加载数据(模组)——解释器模式
2、沙盒模式
基类用于隐藏游戏引擎实现细节
3、类型对象模式
当需要定义一系列不同的“种类”,但不想硬编码进类型系统(不知道将来会有什么类型),避开子类继承,保持多态灵活性
解耦型模式
1、组件模式
单一实体横跨了多个域。每个域的代码都独立地放在组件类中,实体本身可以简化为这些组件的容器。对于庞大的类的解耦。例如unity3d的GameObject类的设计就是如此
2、事件队列
对消息或事件的发送与受理进行时间上的解耦,例如窗体程序。
3、服务定位器
为某服务(特别是随时要被访问的服务,如游戏音频)
优化型模式
1、数据局部性
通过合理组织数据,利用CPU的多级缓存机制来加快内存的访问速度(避免缓存未命中、分支预测失准、流水线停顿)
2、脏标记模式
将工作推迟到必要时进行。例如缓存一些物体的世界变换,并用一个标记它是否过期,可以减少CPU的计算
3、对象池
使用固定的对象池重用对象,取代单独地分配和释放对象。例如例子系统。让游戏能通过浸泡测试(防止内存扩张和泄露)
将相同类型的对象在内存上整合,能利用好CPU的缓存区提高效率
4、空间分区模式
将数据存储在根据位置组织的数据结构中来高效地定位它们。