有一种有趣的方式可以研究过去的计算机体系结构。 找到一个您知道的程序,然后尝试弄清楚它是如何移植的。
一个不错的选择是DOOM 。 1994年id Software的巨著被移植到了所有可能的东西上。 游戏是围绕核心设计的,显然分为几层。 通常很容易找到和阅读六个I / O子系统的实现。
另一个选择是埃里克·查伊(Eric Chailly)的《 另一个世界 1991》,该书在北美更广为人知。 我想说,由于多边形图形适合进行野性优化 ,因此学习起来比DOOM实际上更有趣。 在某些情况下,棘手的特技使游戏可以在发布游戏五年之前制造的设备上运行。

- 多边形另一个世界。
- 多边形另一个世界:Amiga 500 。
- 多边形另一个世界:Atari ST 。
本系列文章是90年代初通过视频游戏设备进行的一次旅程。 从Amiga 500,Atari ST,IBM PC,Super Nintendo,到Sega Genesis。 对于每台机器,我试图找出如何实现“另一个世界”。
在最好的情况下,我设法与原始开发人员联系。 最糟糕的是,我必须自己弄清楚反汇编的代码。 这是一次有趣的冒险。
另一个世界101
另一个世界有很多代码。 据报道 ,Amiga的初始版本只有6,000行。 在PC下DOS的可执行文件仅为20 kB。 如此庞大的游戏令人惊讶地出现在一张1.44 MiB软盘上。 这是因为大多数业务逻辑都是使用字节码实现的。 Another World可执行文件实际上是读取并运行uint8_t
操作码的虚拟机主机。

另一个世界中的虚拟机定义了256个变量,64个线程,29个操作码和3个帧缓冲区 (来自PatientZero的 翻译 )。 仅此而已。 如果为可以处理此问题的虚拟机创建主机,则可以启动游戏。 如果您可以使虚拟机足够快地以每秒20帧的速度运行,那么您实际上可以玩游戏。
虚拟机图形系统使用具有16色调色板的320x200坐标系。 考虑到Amiga 500支持多达32种颜色,调色板限制可能会令人惊讶。 这样做是有目的的,这使得可以将图形与当时的另一个大型平台-Atari ST组合在一起,该平台仅支持16种颜色。
但是没有一线希望。 这种局限性导致了独特的风格,多年来,这种风格仍然令人赏心悦目。






即使可以为场景使用特定的调色板,Eric Shayi还是决定不使用。 与野兽发生碰撞时,只使用了三种颜色:黑色代表身体,红色代表眼睛,米色代表牙齿。 其余的都由想象力完成。


在最初的场景中完全展示了一个类似的调色板系统。 非常便宜的调色板更改使描绘雷击变得容易。





法拉利大灯发出的光线是半透明的。 它们被涂上了不存在的特殊0x10
颜色,因为只有16种颜色可用。 特殊值被解释为“读取帧缓冲区索引,添加0x8
并返回”。 诀窍的最后一部分是巧妙地选择调色板中的下8种颜色。

三个帧缓冲区
在这三个帧缓冲区中,两个用于双缓冲,而后者用于保留背景(BKGD)组成。 此优化避免了重绘静态背景的所有多边形,而采用了简单的复制操作。
在下一个视频中,了解如何首先在BKGD缓冲区中绘制新场景。 每个新的BKGD帧都完全复制到双缓冲区。 绘制了移动元素,例如莱斯特。 请注意,将汽车“停放”后,它也会在BKGD缓冲区中绘制,以最大程度减少在后续帧中绘制的多边形数量。
另请注意,构图如何使用艺术家的简单算法 ,尽管算法很简单,但会导致不必要的重画 。 这不是问题,因为它很大程度上由BKGD副本贬值。
虚拟机操作码
下表显示了29个操作码。 在这里,您可以找到用于流控制(THRD),帧缓冲区管理(FB)和所有寄存器管理操作的操作码。 除了COPY FB,FILL和DRAW_POLY *以外,大多数操作都是“简单”的实现,它们在性能方面很复杂。

两种DRAW_POLY_ *操作码都跨越一个以上的单元格。 DRAW_POLY_BACKGROUND占据操作码空间的一半-从0x80
到0xFF
。 非常浪费,但这是节省空间的技巧。 使用从位“ 1”开始的所有操作,可以将其他7位作为渲染参数传输到操作码空间。 由于此操作码用于背景和合成词,因此节省空间非常重要。
SPRITE版本使用所有以“ 01”位开始的操作码,而其余6位用于编码[x,y]坐标并缩放以渲染莱斯特,朋友和敌人的“精灵”。
接下来是什么?
如前所述,在29个操作码中有26个易于实现。 移植此游戏时,真正的问题是在总线和处理器带宽的限制内操纵像素。 本系列文章将讨论如何在端口上操作帧缓冲区以及如何解决DRAW,FILL和COPY操作码的问题。