# 3.6 屏幕 & 2D 图形显示 Screens & 2D Graphics

1960s 的 PDP-1 的电脑、屏幕、电传打字机是分开的，因为早期的文本任务和图形任务是分开的。早期的屏幕无法显示清晰的文字，打印到纸上会有更高的对比度和分辨率。

![PDP-1](https://275040345-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FycDQGvckh16RY095vh62%2Fuploads%2Frd9fPw4zBPGyxKmnUobr%2F0.png?alt=media)

屏幕早期的典型用途是跟踪程序运行的情况，显示寄存器中临时存储的值等。此时屏幕还很少用于输出计算结果，其会打印到纸上或是更永久的媒介中。

## 3.6.1 阴射射线管（CRT）

阴射射线管（Cathode Ray Tubes, CRT）的原理是将电子发射到有磷光体图层的屏幕上，当带电粒子的电子撞击图层时，其会发光几分之一秒。

![CRT](https://275040345-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FycDQGvckh16RY095vh62%2Fuploads%2F6IwTnZkgQVEvW5pbMpjq%2F1.png?alt=media)

而电子的撞击路径可以通过磁场控制，在屏幕内使用线圈或是板子引导电子即可，主要有两种绘制图形的方式：

1. 矢量扫描（Vector Scanning）: 引导电子束描绘出形状，就算发光只持续一小会，但只要重复得够快，就可以得到清晰图像。
2. 光栅扫描（Raster Scanning）: 按照固定路径逐行从上向下、从左到右地不断重复，只在某行特定点打开电子束，从而绘制图形。

液晶显示器（Liquid Crystal Display, LCD）可以显示清晰的像素点，其使用光栅扫描，每秒更新多次单个像素中红绿蓝的颜色，但早期计算机因像素占用太多内存而弃用。

## 3.6.2 字符生成器

字符生成器（character generator）基本算是第一代显卡，是一种用于从内存中读取字符转换为光栅图形的硬件。

为了节约内存，早期计算机不存储大量像素值，而是存储最典型的 80×25 = 2000 个符号。在字符生成器中的内部 ROM (Read-Only Memory, 只读程序存储器) 中，存储着每个符号的图形，称为「点阵图案」（dot matrix pattern）。

当某 8 位二进制被解读为字符，则会将字母生成器中的点阵图案写进计算机内存中的特殊区域——「屏幕缓冲区」（screen buffer）。程序在显示文字时，修改这个区域里的值即可。

扩展后的 ASCII（比如 IBM CP437 字符集）再加上某些可以用额外比特定义字体颜色和背景颜色的系统，可以实现用字符模仿图形界面，比如 DOS。

![DOS](https://275040345-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FycDQGvckh16RY095vh62%2Fuploads%2Fz47npnhKt87xsWHWDVco%2F2.png?alt=media)

## 3.6.3 矢量模式（vector mode）

矢量模式（vector mode）使用矢量指令绘制出线条来组成所有东西，比如早期的矢量系统 Vectrex，使用笛卡尔坐标系来标注电子枪的绘图点，修改相应强度。

![矢量模式](https://275040345-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FycDQGvckh16RY095vh62%2Fuploads%2FBbzoEoglmk5f9JIADq6m%2F3.png?alt=media)

这些矢量模式的命令可以按序存储在屏幕缓冲区中被读取，程序可以随时间更新这些值做出动画效果。

最早的电子游戏之一 Spacewar 是 1962 年在 PDP-1 上使用矢量图形制作的。其启发了许多后来的游戏，比如《爆破彗星》（Asteroids），甚至是第一个商业游戏《太空大战》（Computer Space）。

## 3.6.4 Sketchpad

1962 年，Sketchpad 出于计算机辅助设计（Computer-Aided Design, CAD）的愿景制作出了交互式图形程序（interactive graphical applications）。Sketchpad 被广泛认为是第一个完整的图形程序，其发明人伊万·萨瑟兰（Ivan Sutherland）后来因此获得图灵奖。

Sketchpad 代表着人机交互的关键点，改变了人们对电脑的观念。电脑不仅可以用于计算，还能够帮助人们进行设计或其他事情。

Sketchpad 提供了光笔和各种按钮来使用户可以划线和其他简单形状。光笔的笔尖使用光线传感器，其通过检测判断显示器刷新时间来让电脑知道笔的位置。

在 Sketchpad 上绘制的线可以完美平行、长度相同、正交垂直、动态缩放，实现保存复用和修改，并且提供了图库可以直接拖拽使用。

## 3.6.5 位图显示（bitmapped displays）

位图显示（bitmapped displays）是指内存中的位（bit）可以对应屏幕上的像素。

绘制任意图形，就像是在修改一个巨大像素值矩阵中的值，这些像素数据存在帧缓冲区（frams buffer）。该区域早期位于电脑内存（computer’s RAM）中，现在存储在高速视频缓存（high-speed Video RAM, VRAM）中。

在 8 位灰度屏幕上，可用的颜色范围为 0（黑）到 255（白）。白色会更偏向绿色或橙色，因为早期显示器不能显示白色。假设低分辨率的位图屏幕分辨率为 60×35，则可以根据坐标系定位像素后把其设为不同颜色。

![VRAM](https://275040345-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FycDQGvckh16RY095vh62%2Fuploads%2F09hgMFhLRrezfO1Uut06%2F4.png?alt=media)

这种绘制矩形的代码也可以包装成函数进行复用，还有其他绘制直线、曲线、图形、文字等内容的函数可以调用。

这种位图的灵活性为交互式操作开启了全新可能，但其成本高昂直至几十年后才有所降低。1971 年，整个美国只有 7w 电传打字机和 7w 终端，而拥有交互式图形屏幕的电脑大约只有 1000 台。
