本系列为作者学习记录
感谢Jack-Cui视频的启发
视频地址:【计算机科学速成课】[40集全/精校] - Crash Course Computer Science
从零开始的自我提升计划:计算机科学(一)
从零开始的自我提升计划:计算机科学(二)
从零开始的自我提升计划:计算机科学(三)
从零开始的自我提升计划:计算机科学(四)
从零开始的自我提升计划:计算机科学(五)
从零开始的自我提升计划:计算机科学(六)
本文内容包括:
二战结束后,美苏开始冷战,政府在科学和工程学上投入大量资金。计算机在战时已经证明了自身的价值,因此政府大量投入资源使得各种项目得以进行。过去的机器都是增强人类的物理能力,而计算机增强的是智力。范内瓦·布什看到了计算机的巨大潜力,描述了一种假想设备Memex,可以存自己所有的书以及其他资料,并且可以快速查询;他还预测了一种新型的百科全书,信息之间相互链接(与维基百科十分相似)。范内瓦·布什做过“美国科学研究与开发办公室”的领导,这个部门负责二战期间科学研究的资助和安排,在冷战期间,他希望建立一个职责类似但是在和平时期也要运作的部门,因此国家科学基金会成立了,至今国家科学基金会仍然负责给科学研究提供资金,对美国科技起到了不可磨灭的贡献。
1950年代,消费者开始购买晶体管设备。收音机小型、耐用、便携等优点使得它十分畅销。日本从贝尔实验室取得晶体管的授权,希望借此来振兴战吼经济。1955年,索尼第一款产品TR-55晶体管收音机问世,他们将重心放在质量和价格,因此短短5年内,日本就占有了没过收音机市场的一半。
苏联的计算机科技,只比西方落后几年,但是在太空竞赛远远领先:1957年发射了第一个卫星,史波尼克1号;1961年,苏联宇航员尤里·加加林第一个进入太空。美国对此极为不满,因此在加加林太空任务一个月后,美国提出要登月,使得NASA的预算增长了几乎十倍。由于航天任务的要求,NASA采用了最新的技术——集成电路,用来设计阿波罗导航计算机,虽然价格昂贵,但是美国也借此成功登月,打败苏联。
很多人说是阿波罗计算机推进了集成电路的发展,但是实际上是军事推进了集成电路的发展,特别是洲际导弹和核弹,使得集成电路大规模生产,美国建造强大计算机时,也进一步推进的集成电路。美国半导体行业通常依靠政府的高利润合同起步,而忽略了消费者市场,因此日本半导体行业靠着低利润率占领了消费者市场。1970年代,太空竞赛和冷战逐渐消退,政府合同变少,美国半导体和电子设备公司发现更难竞争,开始缩小、合并甚至直接倒闭。美国公司的无力,使得夏普、卡西欧等日本公司占领了1970年代的主流产品——手持计算机。很快,日本的电子产品到处都是,从电视手表到随身听,廉价的微处理器也催生了全新的产品,比如街机游戏。这段时间,第一批家用电脑开始出现,在短短三十年内,计算机从大到人类可以在CPU内随意走动,发展到小孩都能拿住的手持玩具。这种变化是两股力量推进的,政府和消费者。
因为CPU、集成电路、储存介质、显示器等产品的成本下降,使得个人专用的想法变得可行。第一台个人计算机比较有争议,但是一般认为第一台取得商业成功的个人计算机是Altair 8800。Altair 8800写程序时仍然是使用机器码,即使是计算机爱好者也不喜欢这么做,比尔·盖茨和保罗·艾伦联系了Altair 8800的公司MITS建议如果可以运行BASIC程序,会更有吸引力。为此,他们需要写一个程序,将BASIC代码转化为可执行的机器码,这叫做“解释器”。MITS看过他们二人的演示后同意在计算机上搭载他们的软件,Altair BASIC成为了微软的第一个产品。
Altair 8800激发了大量的计算机爱好者,在爱好者小组聚会上,Steve Wozniak开始设计自己的计算机,后来他展示了原型机,并把电路图分享给其他成员,他的设计要连接电视显示并且提供文本界面。同是俱乐部成员的Steve Jobs建议说预期免费分享设计,不如直接出售安装好的主板,1976年7月开始发售,名为Apple-Ⅰ,这是苹果公司的第一个产品。
1977年,市场上有了三款开箱即用的计算机。第一款是Apple-Ⅱ,苹果公司第一个提供全套设备的产品,提供了简单的彩色图形和声音输出,这些功能对于低成本的机器非常了不起;第二款是TRS-80 1型,虽然不如Apple-Ⅱ先进,但是价格是其的一半,因此销量更加火爆;第三款是Commodore PET 2001,使用一体化设计,集成了计算机、显示器、键盘和磁带驱动器。
上面三者都自带了BASIC解释器,使得不那么精通计算机的人也能用BASIC写程序。针对消费者的软件行业开始腾飞,市场上出现了各种针对个人计算机的游戏和生产力工具,例如计算器和文字处理器,最火的是VisiCalc,第一个电子表格程序。IBM开始意识到个人计算机市场的重要性,IBM开始与外部公司竞争来给新计算机做硬件和软件,IBM的个人计算机IBM PC发布后立马取得了成功。最具影响力的是它使用“开放式架构”,有良好的文档和扩展槽,使得第三方可以做硬件或者外设,这产生了巨大的生态系统,这个开放式架构叫“IBM Compatible(IBM兼容)”。因为IBM兼容的潜在用户较多,软硬件开发人员更愿意投入在这个平台;因为软硬件多,用户也更加愿意买IBM兼容的计算机,导致那些生产非“IBM兼容”的计算机公司几乎都失败了。只有苹果公司在非IBM兼容下保持了足够的市场份额,它选择了相反的方式:“封闭架构”,即自己设计一切,用户一般无法添加新硬件到计算机中。
苹果在1984年发布的Macintosh是普通人可以买到的第一台图形用户界面的计算机,还带有一个鼠标。它使用一个“选择并且点击”的界面替代了命令行窗口,使得任何人都可以用计算机解决问题,不必记忆复杂的命令。1964年,图形界面先驱恩格巴尔特与同事的共同努力之下,创造了第一个计算机鼠标,虽然在商业上失败了,但是它对于当时计算机研究者的影响巨大,他也因此获得了1997年的图灵奖。
在之前中说到过政府资金在1970年开始减少,所以恩格巴尔特团队内的很多人都去了“帕洛阿尔托研究中心”,即Xerox PARC,他们在这里开发了第一台真正带有GUI的计算机——施乐奥托(Xerox Alto),为了让用户更加容易理解,他们将2D屏幕当作“桌面”,将程序所在的框内叫做“窗口”,他不是真正桌面的复制,而是用桌面进行隐喻,因此叫“桌面隐喻”。Alto团队使用窗口、图标、菜单和指针来做界面,因此称为WIMP界面(对应每个单词的首字母),它还提供了一些基本部件,例如按钮、滑动条、标签页等。
GUI是“事件驱动编程”,代码为响应事件可在任意时间执行,比如点击某个按钮执行相应的程序。1981年,PARC团队发布了施乐之心(Xerox Star)系统,扩展了桌面隐喻,文件可以存放在文件夹内也可以放在桌面上,以此来隐喻文件系统。施乐(Xerox)在文本和图形制作工具领域有许多领先,他们首先使用了“剪切”、“复制”、“粘贴”这样的术语,施乐认为无论在计算机上做什么,文件打印出来应该一模一样,即所见即所得(What You See Is What You Get, WYSIWYG)。
史蒂夫·乔布斯曾经去过施乐公司参观,施乐公司展示了一个清晰的位图显示器上,运行着施乐公司的图形界面,操作全部依靠鼠标直观进行,使得史蒂夫拨云见日,回到苹果公司后,他和随行工程师们开始开发新功能,比如菜单栏和垃圾桶等。苹果第一款有图形界面和鼠标的产品,是1983年发布的Apple Lisa,但是价格昂贵,导致了商业的失败。幸运的是苹果还有另外一个项目,就是Macintosh,取得了巨大成功。
不久之后,微软发布了Windos1.0,奠定了统治地位,十年内,95%的个人计算机上都有Windows。Windows3.1之后,微软开始开发面向消费者的新的GUI操作系统,叫Windows 95,这个版本不仅提供了精美的界面,还有许多Mac OS没有的功能。
如今的用户界面是自然选择的结果,几乎都是WIMP的变化版,人们尝试了各种做法改进但是几乎都失败了。现在,计算机科学界和界面设计师会继续努力工作,做出更好更强大的界面。
之前我们所讲到的内容都是2D的,但是我们生活的世界是一个3D的,本节讲述3D图形的基础知识以及如何将3D图形渲染到2D屏幕上。2D图像中,点的坐标只有XY两个分量,而在3D图像中,有3个分享XYZ,但是2D的屏幕上不可能有XYZ立体坐标轴,所以有图形算法将3D坐标“拍平”显示到2D屏幕上,这叫做“3D投影”。所有点从3D转换成2D后,就可以用画线段的函数,连接这些点,这叫做“线框渲染”。
将立体图像投影到平面上,就是3D转2D的方法,这叫做“正交投影”。在真实的3D世界中,平行线段会在远处收敛于一点,这叫做“透视透射”。绘制立方体这种图形,使用直线即可,但是绘制更复杂的图形,使用三角形会更好,在3D图形学中,将三角形称为“多边形(Polygons)”,一堆多边形的几乎叫“网格(Mesh)”。网格越密,表面越光滑,细节越多,但也需要更多的计算量。选择三角形的原因是3点可以确定唯一的平面。
3D图形还需要填充,填充的经典算法叫“扫描线渲染(Scanline Rendering)”,这种算法通过逐行扫描填满2个相交点之间的像素来完成填充,但是这样的填充结果使得边缘十分粗糙,充满锯齿,当像素较小时,就不是很明显了。一种减轻锯齿的方法叫“抗锯齿(Antialiasing)”,通过判断多边形切过像素的程度来调整颜色,当像素在多边形内部时,就直接着色,若多边形经过像素,颜色就浅一点。
在3D场景中,多边形到处都是,有些部分会被其他多边形挡住,这叫“遮挡”,处理这种现象的最简单方法就是对多边形从远到近排序,然后依次渲染,这叫做“画家算法”,与画家作画的顺序一致,因此得名。还有一种方法叫做“深度缓冲”,这个算法不需要排序,所以速度更快,它首先将图形缓冲器内所有区域的距离初始化为无限大,然后将多边形的距离与缓冲器内的值比较,总是记录更小的值,然后和扫描线算法的改进版配合使用,不仅可以勘探到线的交叉点,还可以知道某些像素在最终场景中是否可见,若不可见,扫描线算法则会跳过那个部分。但是当两个多边形的距离一致时,无法确定哪一个多边形画在上面,导致出现Z-fighting效果(有点类似穿模)。
3D游戏中有个优化方式叫“背面剔除”,很多模型只会看到多边形的正面,为了节省处理时间,会忽略多边形的背面(卡BUG进入模型内地面会消失的原因)。3D场景中物体表面应该有阴暗变化,这叫做“明暗处理”,物体表面不同位置的多边形所面对的方向不同,这个面对的方向叫“表面法线”,加入光源后,因为角度不同使得光线反射到观察者的亮度也不同,以此来确定多边形的亮度,使得图形更加真实。这种算法叫做“平面着色”,是最基本的照明方法,但是会造成多边形的边界非常明显,看起来不光滑。为了解决这个问题,开发了“高洛德着色”以及“冯氏着色”等算法,不止使用一种颜色给整个多边形上色。
3D图形的纹理也十分重要,纹理也有许多算法,来得到不同的效果。最简单的是“纹理映射”,在填充多边形时,查询内存内的纹理图像,平均取色后填充。
不论多大的场景,渲染过程都是一致的,一遍又一遍的处理所有多边形,有几种方法可以加速渲染。例如为这种特定运算制作专门的硬件来加速,将3D场景分解为多个小部分并行渲染等。工程师们为图形制作了专门的处理器,叫“**图形处理单元(Graphics Processing Unit, GPU)”,GPU在显卡上,周围有专用的RAM,现代的一些显卡,每秒可以处理上亿个多边形。
本文介绍了冷战和消费主义、个人计算机革命、 用户图形界面以及3D图形。