阅读推荐—游戏引擎黑皮书:Wolfenstein 3D

不要走路,跑来买这本书!

我去年读过的最有趣,最有趣的书之一是Fabien Sanglard的“游戏引擎黑皮书:Wolfenstein 3D”。 我的一些乐趣来自阅读本书时的怀旧气氛:我的第一台PC是386SX,并且经常使用带有Wolfenstein 3D共享软件版本的软盘。 书呆子并仔细研究一些汇编代码清单的细节,这是纯粹的乐趣。 无论如何,我读完了这篇文章。

本书以创建Wolfenstein 3D时可用的硬件为背景,并着重介绍了创建可以在其上运行的“第一人称射击”游戏的技术挑战。 关于id Software团队的一章很短(如果您对此主题感兴趣,我会推荐另一本很棒的书,《 Doom大师》),然后是其中的内容:深入研究Wolfenstein的引擎。

当我向人们介绍这本书时,我遇到的问题是,我是否从书中得到任何有用的见解。 当我主要是为了娱乐而阅读时,它使我产生了思考。 通过阅读有关90年代初开发的游戏的书,软件开发人员在2018年可以学到什么? 这是我的外卖。

浮点表示

这本书提供了我所读过的关于浮点数如何工作的最直观的解释。 这本书值得一读。

次要性能优化确实很重要

我们生活在一个陌生的世界。

我们被令人惊叹的硬件所包围,我们每天与同样神奇的软件进行交互,这些软件几乎可以完成神奇的工作。 但是,就像我们经常使用令人惊奇的硬件被不太出色的软件所困扰一样,我们被迫等待永恒的感觉来完成简单的任务。

这是一个有趣的话题,值得自己撰写一整篇文章。 我只在这里提出两点:从业务角度来看,性能不错,通常只需要几个基本功能,而仅具有基本功能就具有惊人的性能。 如果程序员看到了大的胜利,他们将在性能优化方面付出更多的努力-将内存占用空间减少一半或使某些工作速度提高一个数量级。

这意味着所有次要优化都将保留。 但是,这种优化使Wolfenstein 3D成为可能! 可能有一两个主要的技巧使id Software的人认为可以完成此项目,但其余的则在这里削减了10%,在那儿削减了5%,以获得不错的帧率。

不要低估复合的力量。

编程

VGA图形卡不支持纹理缩放的硬件,因此必须由软件完成。 为了获得更好的性能,您无法即时进行所有计算。 所需要的是一组简单的“绘制纹理的第N列,将其缩小到40像素”的组装例程。

它们不是手写的。 取而代之的是,有一个函数在运行时生成了所有必要的“定标器”。 这是元编程的一个示例:程序编写自身的另一部分。

在Android世界中,我们有几种元编程:注释处理,反射,代码编织以及最近的Kotlin编译器插件。 他们的问题是,他们感到很陌生,有严格的限制,或者无法与常规代码顺利地互操作。 它们有很大帮助,但我希望有一个更好的选择,一种感觉会更自然。

转换您的资产,以便随时使用

Wolfenstein 3D中的精灵(敌人,战利品,环境元素)没有作为常规位图存储或着色。 为了同时处理缩放和透明度,将它们转换为小的元程序,这些程序修改了常规纹理缩放器。

这也是它们在游戏资源文件中存储在磁盘上的格式! 从艺术家交付的实际资产到游戏可以在运行时使用的东西的转换是在构建过程中完成的。 绝对是一种技术,现在甚至在遥远的将来都可能有用。

不要修饰非关键代码

阅读本书之后,我看了看Wolfenstein 3D源代码并阅读了内存管理器模块。 它很丑陋,而且非常脆弱,因为它依赖于一些未记录的假设和看似无关的实现细节。 简而言之,这是一种不会通过代码审查的代码。

有关系吗? 一点也没有。 这很丑陋,但却能发挥作用。 它很脆弱,但没有破裂的风险,因为没有理由对其进行更改。 它依赖于未记录的假设,但是如果这些假设在整个代码库中足够深入地嵌入,则它们永远不会改变。

下次我会对一些丑陋的骇客做出下意识的反应时,我会尽量记住这一点。

泡沫淡化

当您的角色在Wolfenstein 3D中死亡时,屏幕逐渐被红色像素覆盖。 实现此目的的一种方法是分配所有可能的屏幕坐标的列表并对其进行改组,但是对于90年代初的硬件而言,这将是非常低效且不可行的。

id Software开发人员发现了另一种很难达到相同效果的方法:一种称为线性反馈移位寄存器的技术。 它允许他们通过一系列XOR操作生成所有像素坐标的序列,而没有任何内存开销。 真正解决眼前问题的绝妙解决方案。

这本书很棒,但不是所有的独角兽和彩虹。 内容非常好,但是坦率地说,这本书的布局有点业余。 我还注意到了六打错字和小错误,这放大了这种印象。

我也认为这本书缺少基本的x86汇编器教程。 前一段时间我写了一些非常简单的x86程序,因此我能够理解书中的代码片段,但是对于完全不了解它的人来说,这将带来不必要的障碍。

今天早上收到推特通知,“ Game Engine Black Book:Doom”可以购买。 我毫不犹豫地订购了一本。 我鼓励您也这样做。