游戏设计模式 #5 序列型模式提炼总结

作者:浅墨
2017-02-10
4 6 0

引言

上篇文章总结了命令模式,本文继续整理序列型模式。

序列型模式 Sequencing Patterns

本章的三种模式都是游戏开发中的常客:

  • 游戏循环是游戏运行的主心骨。
  • 游戏对象通过更新方法来进行每帧的更新。
  • 我们可以用双缓冲模式存储快照,来隐藏计算机的顺序执行,从而使得游戏世界能够同步更新。

双缓冲模式 Double Buffer

双缓冲模式,使用序列操作来模拟瞬间或者同时发生的事情。

要点

  • 一个双缓冲类封装了一个缓冲:一段可改变的状态。这个缓冲被增量的修改,但我们想要外部的代码将其视为单一的元素修改。 为了实现这点,双缓冲类需保存两个缓冲的实例:下一缓存和当前缓存。
  • 当信息从缓冲区中读取,我们总是去读取当前的缓冲区。当信息需要写到缓存,我们总是在下一缓冲区上操作。 当改变完成后,一个交换操作会立刻将当前缓冲区和下一缓冲区交换, 这样新缓冲区就是公共可见的了。旧的缓冲区则成为了下一个重用的缓冲区。
  • 双缓冲模式常用来做帧缓冲区交换。

使用场合

双缓冲模式是那种你需要它时自然会想起来的模式。以下情况都满足时,使用这个模式很合适:

  • 我们需要维护一些被增量修改的状态
  • 在修改过程中,状态可能会被外部请求。
  • 我们想要防止请求状态的外部代码知道内部是如何工作的。
  • 我们想要读取状态,而且不想在修改的时候等待。

引申与参考

游戏循环模式 Game Loop

游戏循环模式,实现游戏运行过程中对用户输入处理和时间处理的解耦。

要点

  • 游戏循环模式:游戏循环在游戏过程中持续运转。每循环一次,它非阻塞地处理用户的输入,更新游戏状态,并渲染游戏。它跟踪流逝的时间并控制游戏的速率。
  • 游戏循环将游戏的处理过程和玩家输入解耦,和处理器速度解耦,实现用户输入和处理器速度在游戏行进时间上的分离。
  • 游戏循环也许需要与平台的事件循环相协调。如果在操作系统的高层或有图形UI和内建事件循环的平台上构建游戏, 那就有了两个应用循环在同时运作,需要对他们进行相应的协调。

使用场合

任何游戏或游戏引擎都拥有自己的游戏循环,因为游戏循环是游戏运行的主心骨。

引申与参考

  • 讲述游戏循环模式的一篇经典文章是来自Glenn Fiedler的“Fix Your Timestep“。
  • Witters的文章 game loops 也值得一看。
  • Unity的框架具有一个复杂的游戏循环,这里有一个对其很详尽的阐述。
  • 本节内容相关的英文原文
  • 本节内容相关的中文翻译

更新方法 Update Method

更新方法,通过每次处理一帧的行为来模拟一系列独立对象。

要点

  • 更新方法模式:在游戏中保持游戏对象的集合。每个对象实现一个更新方法,以处理对象在一帧内的行为。每一帧中,游戏循环对集合中的每一个对象进行更新。
  • 当离开每帧时,我们也许需要存储下状态,以备不时之需。

使用场合

更新方法和游戏循环模式一般一起使用。更新方法适应以下情况:

  • 游戏中有很多对象或系统需要同时运行。
  • 每个对象的行为都与其他的大部分独立。
  • 游戏中的对象需要随时间模拟。

引申与参考

  • 更新方法模式,以及游戏循环模式和组件模式,是构建游戏引擎核心的铁三角。
  • Unity引擎在多个类中使用了这个模式,包括MonoBehaviour。
  • 微软的XNA框架在 Game 和GameComponent 类中使用了这个模式。
  • 当你关注在每帧中更新实体或组件的缓存性能时,数据局部性模式可以帮上忙。
  • 本节内容相关的英文原文
  • 本节内容相关的中文翻译