游戏设计模式读书笔记:游戏循环

游戏循环

  • 游戏循环是一个游戏系统中最为关键的环节,可以说只要开发游戏就会用到这个模式,只不过它很多时候已经被集成到了引擎当中。在使用Unity引擎的过程中,可以体会到一个游戏中所有的表现都依赖于循环。
  • 不同于传统软件循环中只等待输入的情况,一个游戏循环在游玩中不断运行。每一次循环,它无阻塞地处理玩家输入,更新游戏状态,渲染游戏。它追踪时间的消耗并控制游戏的速度。
  • 有时候在某个平台开发游戏循环时,需要使用平台特有的事件循环。

游戏设计模式读书笔记:状态模式

解决了什么问题

  • 在游戏开发中状态是一种常见的用于描述游戏对象的方法,在状态比较简单的情况下可能通过多个标志位变量就可以组合出不同的状态。例如书中举得英雄行走、跳跃、蹲下等操作。但是一旦当对象的状态可是变得比较多,而且需要通过比较多的变量才能描述清楚时,只使用标志位变量的弊端就出现了:那就是过多的变量在代码编写时需要的条件语句会很多,而且变量的组合也不利于管理。

游戏设计模式读书笔记:组件模式

为什么是组件

意图

  • 允许单一的实体跨越多个领域而不会导致这些领域彼此耦合。

实体-组件-系统(ECS)

  • 组件模式在游戏中常见的体现就是ECS

游戏设计模式读书笔记:原型模式

原型模式

定义

  • 定义:原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的“原型”,这个原型是可定制的。
    原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。
  • 看图
    image

游戏设计模式读书笔记:双缓冲

第三篇:序列模型

  • 双缓冲模式算是书中第三篇:序列模型中的一个,它与游戏循环和更新方法组成了第三篇。后两者可以说是在我做Unity中最常用到的,而且也是游戏引擎本身已经实现了的。谨以下文来说明下序列模型部分的重要性。

电子游戏之所有有趣,很大程度上归功于它们会将我们带到别的地方。 几分钟后(或者,诚实点,可能会更长),我们活在一个虚拟的世界。 创造那样的世界是游戏程序员至上的欢愉。

大多数游戏世界都有的特性是时间——虚构世界以其特定的节奏运行。 作为世界的架构师,我们必须发明时间,制造推动游戏时间运作的齿轮。

这本篇的模式是建构这些的工具。 游戏循环是时钟的中心轴。 对象通过更新方法来聆听时钟的滴答声。 我们可以用双缓冲模式存储快照来隐藏计算机的顺序执行,这样看起来世界可以进行同步更新。

游戏设计模式读书笔记:观察者模式与事件队列

观察者模式

定义

  • 定义:在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。
  • 看图

游戏设计模式读书笔记:命令模式

模式定义

  • 定义:将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。

  • 看图(图片资源来自于百度,侵删)

游戏设计模式读书笔记:架构、性能、游戏

架构、性能、游戏

  • 在开始读第一章的时候会觉得有点混乱,作者提出了什么是架构这个问题,但是并没有像其它书里那样给出一个明确的定义,而是提到了:

    这本书是关于上面这一切要使用的代码的组织方式。这里少谈代码,多谈代码组织。

  • 仔细品读这句话,你会发现这里面其实已经提到了什么是架构:所谓架构就是代码的组织方式。但是从我个人的认识来看这并不够全面,在这里在引用几段《架构漫谈》中的文字来阐述什么是架构:

    在每个人都必须自己完成所有生活必须品的生产的时候,是没有架构
    的(当然在个人来讲,同一时刻只能做有限的事情,在时间上还是可能会
    产生架构的)。一旦产生的分工,就把所有的事情,切分成由不同角色的什么是架构
    人来完成,最后再通过交易,使得每个个体都拥有生活必须品,而不需要
    每个个体做所有的事情,只需要每个个体做好自己擅长的事情,并具备一
    定的交易能力即可。

    这实际上就形成了社会的架构。那么怎么定义架构呢?以上面这个例
    子为例,把一个整体(完成人类生存的所有工作)切分成不同的部分(分 工),由不同角色来完成这些分工,并通过建立不同部分相互沟通的机制, 使得这些部分能够有机的结合为一个整体,并完成这个整体所需要的所有 活动,这就是架构。

    软件架构实际上包括了:代码架构, 以及承载代码运行的硬件部署架构。实际上,硬件部署架构最终还是由代 码的架构来决定。因为代码架构不合理,是无法把一个运行单元分拆出多 个来的,那么硬件架构能分拆的就非常的有限,整个系统最终很难长的更大。

  • 关于架构和性能的冲突,我认为这个点写的很好,可以说我之前没有这样的认识。长久以来我都希望写出非常面向对象的代码,在我长久的认知中,代码的灵活性、高扩展性和可维护性是最重要的,因此设计模式是我在编写代码时所追求的。

  • 但是作者提出良好的架构是需要很大的代价的,因为这需要遵守一些列的准则,Coder必须谨慎的组织代码,而且在引入了抽象,引入了可扩展性,引入的某个设计模式时,我们在增加了代码的灵活性的同时也增加了不可读性,增加了代码复杂度,这就增加了理解的难度。过度的架构设计往往会导致代码库失控,也许你会看到接口和抽象无处不在,我们可能需要花费大量时间才能找到真正功能的代码。关于这一点我也是深有体会,最近在看UniRx库,发现各种接口齐飞,大量的重载,梳理起来确实很费劲。

  • 同时,从代码本身执行角度来说,灵活的代码往往意味着执行速度比较慢。从UNITY的角度来说,因为有类似CLR的东西,当使用面向接口编程时,往往意味这具体类型的判断需要在运行期,JIT做的越多,性能也越差。而且还很可能导致无法实现代码缓存,每次运行都需要实时的做判定。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×