本文是有关“另一个世界”游戏端口的系列文章的一部分。 它将讨论与Amiga 500一起使用时的技巧 。 建议您先阅读上一篇文章 。
Amiga的故事始于1982年中,拉里·卡普兰(Larry Kaplan)致电杰伊·迈纳(Jay Miner)。 他们俩都在70年代在Atari工作。 双方都决定离开公司。 卡普兰(Kaplan)缺乏知名度,而矿工(Miner)由于禁止使用炫酷但价格昂贵的摩托罗拉68000处理器而处于领导地位。
Kaplan离开Atari创立了Activision。 投资者要求他开发新的游戏平台后,他联系了他认识的最聪明的人。 矿工在新成立的Hi-Toro公司处理了问题的硬件。 系统收到了代号“洛林”。
到1983年底,组装了一个原型。 由于Boing Ball演示,该设备使1984年1月的美国消费电子展(CES)的参观者印象深刻,其中巨大的子画面以每秒60帧的帧速率移动。 该设备于1985年以“来自Commodore的Amiga”的名称发布,后来更名为Amiga 1000。

注意: Amiga 1000无法自行启动,该设备没有ROM。 引导加载程序位于软盘上,如果将其存储为您的眼睛,那会更好!
系列文章
- 多边形另一个世界 。
- 多边形另一个世界:Amiga 500。
- 多边形另一个世界:Atari ST 。
A500
到1985年,在一系列错误之后,准将处于濒临破产的令人震惊的境地。 当时的首席运营官Thomas Rattigan进行了根本性的改变。 除了涵盖公司几乎所有部门的雄心勃勃的计划外,他还将Amiga 1000分为两种产品:一种为创意市场设计的高端新产品Amiga 2000,另一种为Commodore 64推出的廉价产品Amiga 500。
Amiga 500,也称为A500,于1987年推出。 在Motorola 68000的支持下,该设备的工作频率为7.16 MHz,并具有512 KB的RAM。 该设备已经非常成功,它在播放器,程序员,尤其是演示现场的人们中广受欢迎。 它是Commodore的最畅销产品(从1987年到1991年售出了大约600万台[1] )。

A500有一个ROM,但是只有足够的内存来容纳称为Kickstart的引导程序。 初始化设备后,Kickstart提示用户插入包含程序或Workbench OS的软盘。 开机时,软盘应保留在驱动器中。 后来的型号,例如A1200(又名有史以来最大的机器),具有2.5英寸硬盘驱动器的空间,并且不再使用软盘了。
建筑学
由于该技术最初是为游戏而创建的[2] [3] ,因此Amiga并非像当时的大多数计算机那样,在具有音频和视频功能的“铁”处理器上构建。 32/16位68000与芯片组一起工作,该芯片组包含三个功能强大的芯片:Paula(音频),Denise(视频)和Agnus(数据处理和同步)。

具有存储器系统的类似设计不仅提供平面寻址,而且还提供处理器和芯片组可用的通用RAM,这极大地促进了Amiga在开发人员中的普及。 为了进行比较,世嘉(Sega Genesis)和任天堂SNES都没有共同的记忆,这是几年后发布的两个强大系统(分别在1989年1月和1990年11月)。
芯片组总线具有复杂的优先级系统,其中68,000个偶数周期不活动。 DMA(直接内存访问)芯片组尝试仅使用奇数个周期来逐渐多路复用总线访问,而不会影响处理器。 但是,并非一切都总是顺利。 特别是阿格努斯(Agnus)在68,000人挨饿的情况下表现良好[4] 。
为了解决此问题,客户可以购买带有专用“ CPU总线”的“快速RAM”扩展,用于68000。按照指示,当屏蔽器[15]的DMA通道处于活动状态时,CPU 68000 [5]不饿。 这使68,000的执行速度翻了一番。
影像系统
视频系统由Denise完全控制,总共提供二十种图形模式[6] 。 最受欢迎的分辨率是320x200,长宽比为1.6,与当时的显示器不符(4/3 = 1.3)。 当帧缓冲区传输到CRT监视器时,宽高比会导致失真。

帧缓冲区不是连续存储的,而是存储在称为位平面的单独存储区域中。 最多可以分配8 KB的五个[7]位平面,每个像素提供5位,从而可以获取32个颜色索引。 乍一看,这种方法看起来很笨拙(特别是对于具有PC经验的开发人员而言),但是Agnus尤其是它的整体优势提供了更高的清晰度。
调色板基于每个通道的4位RGB颜色空间。 每种颜色12位允许您识别多达4096种不同的颜色,这比同一时代的计算机上的常用颜色要多得多。
许多技巧使我们可以显示更多颜色。 与Copper一样,您可以将调色板更改为HSYNC。
以下两个图像代表RGB颜色空间的两个相对侧。 黑色在坐标(0x0、0x0、0x0),红色在(0xF,0x0、0x0),绿色在(0x0、0xF,0x0),蓝色在(0x0、0x0、0xF)和白色在(0xF,0xF)0xF) 。 这些彩色图像很好地说明了图形开发人员的创作自由。

Amiga的另一个世界
实际上,Amiga上的另一个世界不是港口。 由于A500用于开发,因此这是由21岁的埃里克·谢伊(Eric Shayy)在他的卧室里独自工作的1989年至1991年之间创建的原始版本。

有两个原因使Amiga成为理想的开发机器。 首先,GenLock允许进行旋转侦查。 其次,也是最重要的是,Amiga Agnus极大地促进了多边形的渲染。
击球手
由于不正确的假设,即Amiga上的“龙之巢,从辛格城堡逃生”使用了它们,因此提出了一种仅基于多边形的游戏的想法[8] 。 埃里克(Eric)必须以某种合理的帧速率实施该操作。 在研发的这一阶段,Amiga炸药发挥了关键作用。
多边形绘图
冲击波文档中提到了一个称为“区域填充模式”的功能。 我们不是在谈论花哨的三维投影或纹理化。 Blitter在屏幕空间上的位字符串上起作用,并具有“填充空白”的选项。 该工作基于从左到右的扫描。 只要阻击器看到0,什么都不会发生。 一旦第一个1通过,阻击器将用到下一个1的单位填充该行。文档中的图说明该方法工作良好。 请注意,即使使用此方法也可以正确显示凹面多边形。
位阵列之前位阵列之后
______________________ ______________________
| | | |
| | | |
| | | |
| 1 1 1 1 | | 11111 11111 |
| 1 1 1 1 | | 1111 1111 |
| 1 1 1 1 | | 111111 |
| 11 11 | | 11 11 |
| 1 1 1 1 | | 111111 |
| 1 1 1 1 | | 1111 1111 |
| 1 1 1 1 | | 11111 11111 |
| | | |
| | | |
| ______________________ | | ______________________ |
这样的解决方案导致了第二个问题-如何绘制多边形的“边界”。 如果仔细查看上图,您会发现这是一种非标准的Bresenham算法[9] ,因为应该跳过水平线。 幸运的是,设计师Amigi将线描模式呈现给了blitter [10] 。
我们还没有完成。 仍然有问题。 首先,“绘制线条然后填充区域”必须进行四次(每个位平面一次),这看起来非常昂贵。 其次,引擎必须渲染数百个多边形。 抖动器需要一个干净的缓冲区,该缓冲区充满零并且要有良好的单位边界。 在经过多个多边形之后,帧缓冲区可能看起来像是一堆汤。 最后,阻击器仅输出1-ts,但是我们需要能够在四个位平面中的一些输出0,以便生成正确的4位颜色。
解决这些问题的方法是配置A,B和C阻击器的输入[11] 。 Blogger Scali在其博客中[12]可以更好地解释此过程。
...有一个解决这个问题的方法,甚至没有那么困难。 Blitter可以在Chipmem中的任何位置进行渲染,因此可以轻松设置临时的清洁缓冲区“ scratchpad”,并在其中绘制多边形。 然后,使用蒙版[16]上的一点光将其复制到屏幕的实际区域。 通常,此操作也称为cookie切割。 本质上,此操作与您仅在原始图像中设置像素时才记录2D图像时使用2D图像时使用的操作相同,否则将目标像素保持完整(逻辑OR操作)。 这样可以正确组合屏幕上的多边形。
实际上,也许现在是时候更详细地说明该攻击者了。 阻击器具有3个输入和1个输出。 所有这些都由DMA处理,因此调整后它可以完全独立于CPU工作。 可以使用逻辑运算来组合3个输入。 然后将结果写入输出通道。 如果蒙版蒙住眼睛,通常需要执行以下操作:
= ( ) ( )
-Scali的OpenBlog
基于阻击器的输入数据,我们现在有了渲染每个多边形所需内容的完整图片。
- 选择一块缓冲区。
- 零清洁,含油渍。
- 在绘制线模式下以单位绘制多边形边界。
- 在“区域填充”模式下,用单位填充缓冲区。
- 闪电击缓冲区四次(每个位平面一次)。
它不是很有趣,但是工作已经完成。 付出的努力是值得的,因为该程序可以每秒20帧的速度处理多达50个多边形(取决于它们的大小)。 这把我们带到了第二个问题。
复制帧缓冲区
不管阻击器绘制多边形的速度有多快,仍然不够快。 每个框架由数千个多边形组成。 一些多边形非常小(1x1,称为像素),以至于无法证明开销。 游戏中最早的背景之一(莱斯特离开水时)由981个多边形组成。

解决方案是通过简单的复制将背景缓存在特殊的BKGD缓冲区中。 对于击打者而言,这是一项特殊的任务。
Blitter是Amiga中的两个协处理器之一。 作为Agnus芯片的一部分,它用于复制矩形存储块和画线。 复制内存时,它比68000快大约两倍,并且每秒可以移动近4兆字节。 他可以每秒近一百万像素的速度绘制线条。
-Amiga开发人员CD v2.1(OS 3.5)
以4000字节(毫秒)的速度,在每个新帧的开头写入BKGD缓冲区仅需要8 ms。
注意:尽管《另一个世界》是一款精美的游戏,但有些优势仍然“粗糙”。 如果玩家在复制保护测验[13]中尝试变得聪明,然后按“ c”键输入代码以进入游戏过程,则屏幕将变为绿色,并且Amiga冻结。 唯一的解决方法是重新启动游戏。
帧缓冲填充
尽管68000处理器一次可以记录16位,但是帧缓冲器也可能使用了冲击清除器。 Amiga文档包含一个示例“ clearmem”代码[14] ,该代码使用blitter清理128 KB的RAM。
参考文献
- 维基百科:Amiga 500 。
- 准将:Amiga年 。
- 准将:最后的岁月 。
- Amiga Chip RAM 。
- 维基百科:Amiga Hardware 。
- Amiga屏幕模式 。
- Amiga实时3D图形 。
- 经典游戏验尸-另一个世界 。
- 布雷森纳姆算法 。
- 6阻击器硬件/区域填充模式 。
- 6个Blitter硬件/ DMA通道 。
- 只是保持真实,第3部分 。
- 码盘 。
- Amiga文档,“示例:Clearmem” 。
- 击球手 。
- 有点发呆 。