1.什么是游戏引擎?
想一想您喜欢的几种不同游戏,并尝试想象它们的内部设计方式。 更重要的是,看看您是否可以找到适用于所有游戏的通用设计元素。 比如所有的游戏都有背景、开屏、地形图、背景音乐游戏引擎原理,不是吗? 如果是,那么它们很可能是围绕游戏引擎的概念设计的。 当您计划创建多个游戏并且不想每次都做同样的事情时,游戏引擎尤其有用。
Windows 游戏的游戏引擎的另一个重要好处是它允许隐藏与游戏无关的 Windows 混乱代码。 游戏引擎很好地组织游戏代码,以便将常见的应用程序任务与特定于游戏的任务分开。 它给游戏开发人员带来的好处是能够向游戏引擎添加可在所有未来游戏中重复使用的功能。 此外,使用游戏引擎还可以简化游戏代码,专注于最重要的游戏代码。 一旦您习惯了使用游戏引擎音效,您就会想知道,还有哪些其他方式可以开发游戏? 事实上,大多数商业游戏开发人员都有自己的自定义游戏引擎,这些引擎是他们多年来在学习大多数游戏所需的通用功能的过程中开发的。 当你设计和开发技术要求更高的游戏时,你自己的游戏引擎可能会在本书中的游戏引擎的基础上得到改进和增强。
2.考虑游戏引擎的作用
游戏引擎处理所有的小事情:构建游戏、确保它正确运行以及关闭它。 虽然这些任务对于任何程序来说确实都是必需的,但游戏结束后的初始化、运行和清理等某些方面确实是特定于游戏的。 因此,游戏引擎必须能够满足游戏的独特需求,并有助于使围绕引擎开发游戏的过程尽可能简单直接。 使用设计良好的游戏引擎,您会发现开发游戏所需的代码比没有游戏引擎时要少得多。 其思路是将某些核心游戏程序开发一次,粘在游戏引擎中,只有在绝对必要的时候才重新处理。 例如,在您编写了加载图像并将其绘制在屏幕上的代码之后,几乎没有理由重写该代码。 加载和绘制图像是所有游戏引擎都需要的基本功能。
TIPS:在时间和资源允许的情况下,您可以选择对游戏引擎内部的一些算法进行优化,以帮助其更高效地运行。 一般来说,首要目标是实现一个可以正确运行的游戏功能,有时间再考虑优化。
2.2.1 将游戏分解为事件
每个 Windows 程序都可以分解为事件,即程序运行时发生的事情,例如鼠标单击和窗口大小调整。 正如 Windows 程序包含必须处理的事件一样,游戏也有自己独特的一组事件游戏引擎原理,在开发过程中必须加以考虑。 将游戏的初始化过程视为负责加载游戏的图形和声音、清理游戏区域、清零分数等的事件。 同样,游戏有用户输入,这意味着鼠标点击和按键是游戏必须自行处理的时间。 另请记住,在 Windows 中,游戏可以最小化或置于后台,这意味着您可能想要暂停游戏。 可以使用两个事件来表示这个激活和去激活过程。
提示:许多商业Windows 游戏只能在全屏模式下运行,这意味着它们不能与其他正在运行的Windows 应用程序并排显示在屏幕上。 即便如此,这些游戏在技术上仍与其他程序同时运行,因此必须可以在另一个应用程序处于活动状态时暂停它们。
许多事件当然可以包含在游戏引擎中,但以下事件是适用于任何游戏的一些核心事件:
初始化,
启动,
结束,
激活2d素材,
禁用,
画,
循环。
初始化时间发生在游戏首次启动时,此时游戏执行重要的初始设置任务,包括创建游戏引擎本身。 开始和结束事件对应于游戏的开始和结束,这是执行与特定游戏会话相关的初始化和清理任务的好时机。 当游戏最小化或发送到后台然后恢复时,会发生激活和停用事件。 当游戏需要自己绘制时,它会发送一个绘制事件,类似于 Windows WM_PAINT 消息。 最后,循环事件使游戏执行单个游戏循环,这一点非常重要,稍后您将了解这一点。
2.2.2 建立比赛计时机制
如果您从未从编程的角度看过游戏,您可能会对游戏中所有运动和动画的实现方式感到惊讶。 除了极其简单的扑克游戏之外,几乎所有游戏都依赖于某种计时机制,让游戏将其执行分解为帧或周期。 游戏的一个周期是一个时间片,通常对应于游戏图形和数据的单个快照。 如果在 VCR 或 DVD 播放器上将游戏作为电影观看,按下暂停按钮可以观看一个独立的循环。 在电影中前进一帧就像是进入了游戏的下一个循环。 在任何给定的周期中,它都有望更新其图形,执行与角色和对象如何移动和相互交互相关的任何其他计算和处理。
了解游戏周期重要性的一个好方法是以实际游戏为例。 以太空入侵者游戏为例,你需要创建一艘飞船和几排外星入侵者。 每个对象都有一个初始位置和速度。 如果太空侵略者没有计时机制和游戏循环,游戏就会永远停留在初始状态,就好像在游戏开始时按下了一个永久的暂停键。 不过我们知道情况并非如此,因为在游戏开始时,敌人会慢慢地穿过屏幕。 如果您逐个循环地观察太空入侵者,您会注意到敌人在每个循环中移动一点点。 这较少,因为在给定的时间段内会发生许多循环,从而产生平滑的移动效果。 游戏循环的作用是更新游戏中所有对象的状态,然后通过更新屏幕上显示的图形来反映这些变化。 从大多数游戏的视觉变化速度来看,你能猜出游戏循环发生的频率吗? 即使对于最慢的游戏,这个速率也不低于每秒 12 个周期,这恰好是人眼看到事物移动而不是看到一系列变化图像的最低频率。 相比之下,电视每秒显示 30 个不同的图像,而电影每秒显示 24 个图像。
TIPS:游戏中的单个图形屏幕称为帧。 因为每个游戏周期都会绘制一个新的图形屏幕,所以游戏速度通常以每秒帧数来衡量。 由于我们谈论的是周期而不是帧,所以我指的是以每秒周期为单位的游戏速度。 但是,每秒的循环数、每秒的帧数、每秒的图像数其实是一个意思。
游戏在给定时间内运行的周期越多,运行起来就越顺畅。 举个极端的例子,将演示文稿的流畅度比作电影。 演示是从一幅静止图像到另一幅静止图像的突然过渡,没有任何过渡或平滑运动的感觉:而电影则呈现流畅的运动,就像在现实中体验过一样。 同样,每秒循环次数较少的游戏会显得不稳定,而每秒循环次数较多会使游戏更流畅。 每秒的大量循环还允许灵活地加速或减慢游戏以达到所需的速度。
知道更多的周期会产生更平滑的图形并提供更好的灵活性,读者可能会认为能够将每秒的周期数设置得较高就可以了。 与现实中的大多数事情一样,游戏周期时间和游戏效率之间存在权衡。 问题是在游戏过程中发生的处理量通常相当大,这意味着要每秒执行多个循环,计算机的处理器和图形卡都必须能够跟上该速度。 即使对于当今流行的速度极快的计算机,大多数计算机执行游戏处理的速度也存在实际限制。 事实上,大多数游戏设置都在每秒15-20个循环之间,最快的速度可以达到每秒30个循环,比电影的速度还要快。 除了一些极少数例外,您应该瞄准的最低速度设置是每秒 12 个周期。
提示:商业 3D 游戏旨在最大限度地发挥当前可用计算机硬件的性能。 现代 3D 游戏的每秒循环数是衡量游戏是否对计算机处理能力造成过多负担的最常见衡量标准。 理想情况下,游戏可以设计为包含非常精致和漂亮的图形,而不必担心游戏会导致用户系统突然停止运行。 在显示方面,游戏设计师总是小心翼翼地让游戏看起来很棒,同时保持适当的帧速率(理想情况下每秒 30 帧或更多)。
了解了循环是如何描述游戏的计时机制后,读者可能会理解为什么循环是游戏事件。 它是这样工作的:当你第一次运行游戏时,用游戏速度(每秒循环数)初始化引擎。 加上每秒 12 个周期的使用,然后游戏引擎负责设置和管理一个每秒触发 12 个重复事件的计时器。 游戏代码接收这些循环消息并对其进行处理——更新游戏中的对象并重绘游戏画面。 将重复发生的事件想象成一个警报,它一遍又一遍地响起以唤醒熟睡的人,在这种情况下每秒仅响起 12 次。 显然,游戏休眠时间不多!
提示:说到睡眠,游戏引擎做的另一件事是当游戏不再处于活动窗口时使游戏睡眠。 实际上,让游戏休眠只是意味着游戏引擎停止发送循环消息,因为没有发送循环消息,所以游戏实际上暂停了。