多边形另一个世界

有一种有趣的方式可以研究过去的计算机体系结构。 找到一个您知道的程序,然后尝试弄清楚它是如何移植的。


一个不错的选择是DOOM 。 1994年id Software的巨著被移植到了所有可能的东西上。 游戏是围绕核心设计的,显然分为几层。 通常很容易找到和阅读六个I / O子系统的实现。


另一个选择是埃里克·查伊(Eric Chailly)的《 另一个世界 1991》,该书在北美更广为人知。 我想说,由于多边形图形适合进行野性优化 ,因此学习起来比DOOM实际上更有趣。 在某些情况下,棘手的特技使游戏可以在发布游戏五年之前制造的设备上运行。




  1. 多边形另一个世界。
  2. 多边形另一个世界:Amiga 500
  3. 多边形另一个世界: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还是决定不使用。 与野兽发生碰撞时,只使用了三种颜色:黑色代表身体,红色代表眼睛,米色代表牙齿。 其余的都由想象力完成。






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










如果场景中只有八种颜色,则引擎还能够创建半透明效果。



此处的颜色存储在[0x0.0x8]中。






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


游戏中不经常使用透明度,


但可以在实验过程中再次看到


当闪电即将将莱斯特传送到另一个世界时。






三个帧缓冲区


在这三个帧缓冲区中,两个用于双缓冲,而后者用于保留背景(BKGD)组成。 此优化避免了重绘静态背景的所有多边形,而采用了简单的复制操作。


在下一个视频中,了解如何首先在BKGD缓冲区中绘制新场景。 每个新的BKGD帧都完全复制到双缓冲区。 绘制了移动元素,例如莱斯特。 请注意,将汽车“停放”后,它也会在BKGD缓冲区中绘制,以最大程度减少在后续帧中绘制的多边形数量。



另请注意,构图如何使用艺术家的简单算法 ,尽管算法很简单,但会导致不必要的重 。 这不是问题,因为它很大程度上由BKGD副本贬值。


虚拟机操作码


下表显示了29个操作码。 在这里,您可以找到用于流控制(THRD),帧缓冲区管理(FB)和所有寄存器管理操作的操作码。 除了COPY FB,FILL和DRAW_POLY *以外,大多数操作都是“简单”的实现,它们在性能方面很复杂。




两种DRAW_POLY_ *操作码都跨越一个以上的单元格。 DRAW_POLY_BACKGROUND占据操作码空间的一半-从0x800xFF 。 非常浪费,但这是节省空间的技巧。 使用从位“ 1”开始的所有操作,可以将其他7位作为渲染参数传输到操作码空间。 由于此操作码用于背景和合成词,因此节省空间非常重要。


SPRITE版本使用所有以“ 01”位开始的操作码,而其余6位用于编码[x,y]坐标并缩放以渲染莱斯特,朋友和敌人的“精灵”。


接下来是什么?


如前所述,在29个操作码中有26个易于实现。 移植此游戏时,真正的问题是在总线和处理器带宽的限制内操纵像素。 本系列文章将讨论如何在端口上操作帧缓冲区以及如何解决DRAW,FILL和COPY操作码的问题。

Source: https://habr.com/ru/post/zh-CN482872/


All Articles