计算机知识

Crash Course 得到的一部分知识。讲的真好,翻译的也真好。

集成电路IC

每两年左右,随着材料和制造技术的发展,同样大小的空间,IC能塞进两倍数量的晶体管。这就是 摩尔定律

操作系统

  • 操作系统可以运行多个程序,但是当我们切换程序的时候我们不希望丢失数据,所以每个程序有指定的内存区。
  • 但有的程序在使用过程中需要更多地内存,所以就会向操作系统提出申请分配更多地内存。如果同意,就会分配另外的内存,但是由于程序都有指定的内存区,所以新分配内存和之前指定的内存就不是连续的。为了解决这个问题,出现了虚拟内存, 虚拟内存和真实内存是映射关系,虽然程序的实际内存是不连续的,但是虚拟内存是连续的,从 0 到 xxxx
  • 由于程序有不同的内存,所以可以内存保护。不同的程序无法访问其他程序的内存。早期的 windows 由于缺乏内存保护,有时候程序的不当使用会导致系统崩溃,从而引发蓝屏

文件系统

文件的本质是一段二进制,通常在前面的几位是文件头,描述了文件的大小,描述了如图片文件的行列数(什么时候换行)…

  • 为了方便扩展文件大小,硬盘上分为一个个存储块,每个文件占用一个或多个存储块,文件占用的存储块随着文件顺序排列,当文件变大的时候分配新的未使用的存储快
  • 为了记录文件所对应存储快,文件同层下会有一个目录文件,记录了当前目录下所有文件的相关信息:创建时间、修改时间、是否是目录、所在的存储块…
    • windows 删除文件的时候其实只是删除了目录文件下对该文件的记录,让我们无法看到,而没有在在硬盘上的删除该文件。所以我们可以通过有些工具恢复删除的文件
    • windows 上同一块存储上移动文件特别快,原因是因为只需要在原来目录下的目录文件中删除该文件信息,然后再目标目录下的目录文件中添加该文件信息即可。而不是在存储结构上真实的移动
    • windows 在多次进行文件的删除、修改、迁移之后,会使得很多文件在存储上占用的存储块都是不连续的。而 碎片整理 就是从新让文件在存储上顺序排列的过程( SSD 不需要 碎片整理

压缩

图片颜色用 红绿蓝 三种颜色合成表示,每个颜色都是 1 个字节, 所以一个 16px 的图片 占用的内存是 16 * 3 = 48 字节。我们可以用以下方法实现减少内存。

无损压缩

  • 游程编码(Run-Length Encoding),常用于出现很多重复值的文件。比如一个图片颜色是 “黄黄黄绿绿绿…” 这种格式,可以改为 “3黄3绿…” 这种格式的代码,保持格式一致。就减少了很少内存。这是 无损压缩
  • 用一种更紧凑的方式表示数据。我们需要一个字典,存储 “代码” 和 “数据” 的关系。这次图片不按像素分,而是按照块分,将每种块换算成不同的代码。根据块出现在文件中的频率,用 “霍夫曼树” 进行排练。这也是一种 无损压缩
    • 定义 :
      • 首先,列出所有块和出现频率,每轮选取两个最低频率的块,组成一个树
      • 然后,将上一步的树和其他的块排列,选取两个频率最低的块,组成树
      • 最后的整个树就叫做 “霍夫曼树”
    • 实例 :
      • 一个文件分为: YY(黄黄)、WY(白黄)、BY(黑黄)、BB(黑黑)
      • 按 “霍夫曼树” 排列为 houfuman_tree
    • 将每个块翻译为代码,且由于在树中的位置不同,这些代码是不会重复的,结果最后为:houfuman_code。48 字节的图片转换为了 14 位 的 10110000111100 , 在前面加上字典,就完成了整个压缩,结果是 30 字节。

几乎所有的无损压缩格式都由上面两个方法组合起来使用,比如: GIF , PNG , PDF , ZIP

有损压缩

丢掉人类无法识别的数据,这种删除人类无法感知的数据的方法叫做 “感知编码” ,比如:

  • 声音有损压缩,去除超声波,以主要精度表示人声,次要精度表示低声波。如 skype 打电话,网速慢的时候压缩会去除更多数据,所以 skype 打电话像机器人。没有压缩的音频格式有 WAV 、 FLAC , 压缩的有 MP3 等,占用内存小了 10 倍
  • 图片有损压缩, 如 JPEG , 删除人类无法感知的。
  • 视频压缩:视频本质是一长串图片,但是视频每一帧之间的差别是很小的。很多视频格式只存帧之间变化的部分NPEG-4 是常见标准,可以比原图片小 20 - 200 倍。

屏幕显示

  • 阴极射线管 (CRT):把电子发射到 有磷光体涂层的屏幕了,当电子撞击涂层时,会发光几分之一秒。电子可以用磁场控制。所以可以用两种方法绘制
    • 引到电子束描绘出形状,叫做 “尺量扫描”
    • 按固定路径,一行行扫描,从上到下,从左往右,不断重复。只在特定的点打开电子束,叫做 “光栅扫描”
  • 位图显示,内存中的位对应屏幕上的像素。

3D 图形

线框渲染

把 3D 坐标拍平到 2D屏幕上,叫 线框渲染, 常用方法有:

  • 正交投影: 立方体的各个边,在投影中互相平行
  • 透视投射: 在真实的 3D 世界中,平行线段会在远处收敛于一点。如图:透视投射

填充图形

3D 图形除了线框渲染,还需要填充

简单的 3D 图形可以用矩形用作最小组成单元。对于复杂的 3D 投射,一般使用三角形用作最小组成单元。因为 3 个点可以确定唯一的一个面。

下面是几种填充算法:

  • 扫描线算法
    1. 先读三角形的3个点, 找最大和最小的 Y 值,只在这两点间工作。如图 初始图形
    2. 然后从上往下,每次一行,计算每一行与三角形相交的2个点。因为是三角形,如果相交一条边,必然相交另一条边
    3. 一直到扫到底部完成,结果如图 扫描线结果

算法缺点:

  • 扫描线算法:
    • 边缘锯齿

缺点解决方案:

  • 减轻锯齿:
    • 抗锯齿: 字体和图标常用。通过判断三角形切过像素的程度,来调整颜色,具体做法如下:
      • 如果像素在三角形内部,就直接涂颜色
      • 如果三角形划过像素,颜色就浅一些,达到一种边缘羽化的效果,结果如图: scan_yuhua

实际渲染过程

由于图形重叠形成遮挡,所以渲染过程有这么几种:

  • 画家算法渲染: 用排序算法将远处的先渲染,然后根据距离再渲染近的。因为画家也是先画背景,再画近的,所以叫 画家算法
  • 深度缓冲(Z-buffering)渲染:不用排序,所以比前面的算法快。具体步骤:
    • 算法会记录每个像素距离屏幕的位置,在内存中存有一个数字矩阵,每个元素总是记录距离屏幕的最小值。
    • 矩阵中每个元素的初始值是无限大,然后类似于扫描线算法进行扫描三角形,总是记录更低的值。假如A三角形距离屏幕为20,由于 20 < “无限大” ,所以记录为20。依次记录完所有的三角形,由于记录的总是最小值,所以跟渲染三角形的顺序没有关系。 如图: z-buffering
堂 wechat
欢迎关注我的微信公众号,里面有各种小故事哦!
坚持原创技术分享,您的支持将鼓励我继续创作!