引言
上篇文章总结了命令模式,本文继续整理序列型模式。
序列型模式 Sequencing Patterns
本章的三种模式都是游戏开发中的常客:
- 游戏循环是游戏运行的主心骨。
- 游戏对象通过更新方法来进行每帧的更新。
- 我们可以用双缓冲模式存储快照,来隐藏计算机的顺序执行,从而使得游戏世界能够同步更新。
双缓冲模式 Double Buffer
双缓冲模式,使用序列操作来模拟瞬间或者同时发生的事情。
要点
- 一个双缓冲类封装了一个缓冲:一段可改变的状态。这个缓冲被增量的修改,但我们想要外部的代码将其视为单一的元素修改。 为了实现这点,双缓冲类需保存两个缓冲的实例:下一缓存和当前缓存。
- 当信息从缓冲区中读取,我们总是去读取当前的缓冲区。当信息需要写到缓存,我们总是在下一缓冲区上操作。 当改变完成后,一个交换操作会立刻将当前缓冲区和下一缓冲区交换, 这样新缓冲区就是公共可见的了。旧的缓冲区则成为了下一个重用的缓冲区。
- 双缓冲模式常用来做帧缓冲区交换。
使用场合
双缓冲模式是那种你需要它时自然会想起来的模式。以下情况都满足时,使用这个模式很合适:
- 我们需要维护一些被增量修改的状态
- 在修改过程中,状态可能会被外部请求。
- 我们想要防止请求状态的外部代码知道内部是如何工作的。
- 我们想要读取状态,而且不想在修改的时候等待。
引申与参考
- 我们几乎可以在任何一个图形API中找到双缓冲模式的应用。如OpenGl中的 swapBuffers() 函数, Direct3D中的“swap chains”,微软XNA框架的 endDraw() 方法。
- 本节内容相关的英文原文
- 本节内容相关的中文翻译
游戏循环模式 Game Loop
游戏循环模式,实现游戏运行过程中对用户输入处理和时间处理的解耦。
要点
- 游戏循环模式:游戏循环在游戏过程中持续运转。每循环一次,它非阻塞地处理用户的输入,更新游戏状态,并渲染游戏。它跟踪流逝的时间并控制游戏的速率。
- 游戏循环将游戏的处理过程和玩家输入解耦,和处理器速度解耦,实现用户输入和处理器速度在游戏行进时间上的分离。
- 游戏循环也许需要与平台的事件循环相协调。如果在操作系统的高层或有图形UI和内建事件循环的平台上构建游戏, 那就有了两个应用循环在同时运作,需要对他们进行相应的协调。
使用场合
任何游戏或游戏引擎都拥有自己的游戏循环,因为游戏循环是游戏运行的主心骨。
引申与参考
- 讲述游戏循环模式的一篇经典文章是来自Glenn Fiedler的“Fix Your Timestep“。
- Witters的文章 game loops 也值得一看。
- Unity的框架具有一个复杂的游戏循环,这里有一个对其很详尽的阐述。
- 本节内容相关的英文原文。
- 本节内容相关的中文翻译。
更新方法 Update Method
更新方法,通过每次处理一帧的行为来模拟一系列独立对象。
要点
- 更新方法模式:在游戏中保持游戏对象的集合。每个对象实现一个更新方法,以处理对象在一帧内的行为。每一帧中,游戏循环对集合中的每一个对象进行更新。
- 当离开每帧时,我们也许需要存储下状态,以备不时之需。
使用场合
更新方法和游戏循环模式一般一起使用。更新方法适应以下情况:
- 游戏中有很多对象或系统需要同时运行。
- 每个对象的行为都与其他的大部分独立。
- 游戏中的对象需要随时间模拟。
引申与参考
暂无关于此文章的评论。