屏幕上看到的一切都是像素,连文字也是像素拼出来的;差别只在——文字模式存的是【第几个字】,图形模式存的是【每个点】。
11.5 讲了怎么把数据快速搬出去,这一节看搬出去之后变成了什么。
一、屏幕上的一切都是像素
屏幕是一大片像素——分辨率就是横向乘纵向的像素个数。 1920 × 1080 就是 2073600 个像素;每个像素要 3 字节(红、绿、蓝各 1 字节)。 实测算下来:一帧 5.93 MiB,每秒 60 帧就是 356 MiB/s。 这个量级说明了一件事:显示器要的数据量大得吓人。
二、显存在干什么
屏幕背后靠的不是 CPU,而是显卡加显存。 显存里存着屏幕上每个像素的颜色,显卡不停地把它刷出去(这就是刷新率)。 CPU 只负责决定【画什么】;【一直送出去】这件事是显卡的活儿。 这也是 11.5 的 DMA 在这儿登场的理由——画面数据正是靠它源源不断送出去的。
三、文字有两种走法
文字模式:显存里存的是【第几个字】,字形由字符发生器去查。 图形模式:每个字都得先变成一小块点阵,再当作像素送出去。 两者数据量差多少?一屏 80 × 40 个字符: 文字模式只要 6400 字节;图形模式要 6220800 字节——差了近千倍。 所以早期的电脑只靠很小的显存就能显示文字,这也是文字界面能干那么多年的原因。
四、字其实是被画出来的
一个 16 × 16 点阵的汉字——256 个点、1 位存一个点、共 32 字节。 屏幕上 40 行 × 80 列这样的汉字,光位图就要 102400 字节。 字号一大,字库和显存就一起吃紧——这正是矢量字体被发明的原因。 矢量字体存的是【怎么画】,不是【每个点是什么】—— 所以它能任意放大而不糊,代价是每次显示都要现算一遍。
五、动手 Demo:显示字符和图像的原理
屏幕上看到的一切都是像素,连文字也是像素拼出来的。 算一算一帧要多少数据,再对比文字模式与图形模式。
W, H, bpp, hz = 1920, 1080, 3, 60
frame = W * H * bpp
print("像素数", W * H)
print("一帧", frame / 1024 / 1024, "MiB")
print("每秒", frame * hz / 1024 / 1024, "MiB")
txt = 80 * 40 * 2
print("文字模式一屏", txt, "字节")
print("相差", frame / txt, "倍")
实跑输出:
--------------------------------------------------------------------
显示字符和图像的原理
--------------------------------------------------------------------
**屏幕上看到的一切都是像素**——**连文字也是像素拼出来的。**
分辨率 1920 × 1080 = 2073600 个像素
一个像素 3 字节(红、绿、蓝各 1 字节)
一帧 5.93 MiB
每秒 60 帧 356 MiB/s
**这几个数字说明了一件事:显示器要的数据量大得吓人。**
所以它背后靠的不是 CPU,而是显卡加显存——**显存的活儿就一句:把内容不断刷出去。**
文字显示则有两种走法,差别极大:
纯文字模式一屏 3200 字符 × 2 字节 = 6400 字节
图形模式一屏 6220800 字节
相差 972 倍
文字模式下,**显存里存的是【第几个字】,字形由字符发生器去查。**
图形模式下没这一说,**每个字都得先变成一小块点阵**:
一个 16×16 点阵的汉字 256 个点,1 位一个点 = 32 字节
屏幕上 40 行 × 80 列汉字 要 102400 字节的位图
所以字号一大,**字库和显存都跟着吃紧**;这也是矢量字体被发明的原因:
**存的是【怎么画】,不是【每个点是什么】——放大也不会糊。**
实测:1920×1080 一帧 5.93 MiB、60 帧 356 MiB/s;文字模式一屏只要 6400 字节,相差 972 倍。 文字模式存【第几个字】,图形模式存【每个点】——这是两者数据量差上千倍的根本原因。
30 秒实验
- 算一算 4K(3840 × 2160)60 帧每秒要多少带宽,跟 1080p 比一比。
- 把系统字号调大一级,想一想显存和字库要多花多少。
常见误区
- 以为文字是【字符】直接送出去的。图形模式下它也是像素。
- 以为分辨率越高只是【更清楚】。它同时也意味着数据量和带宽成倍上涨。
自测三问(点开对答案)
1. 一个像素要几个字节、1920×1080 一帧多大? —— 3 字节(红绿蓝各 1 字节);一帧 6220800 字节,约 5.93 MiB。 2. 文字模式和图形模式的根本差别是什么? —— 文字模式显存里存的是第几个字、字形由字符发生器查;图形模式存的是每个点的颜色。 3. 矢量字体为什么能无损放大? —— 它存的是怎么画(几何描述)而不是每个点,所以放大时重新计算即可,不会出现马赛克。- ☐ 下一章(第十二章 如何让计算机【学习】)
相关笔记
- 能够快速传输大量数据的DMA — 这么多数据靠谁搬出去
- 应用程序是否与硬件有关 — 从应用层看不看得见硬件
- 汇编语言的语法是【操作码 操作数】 — 这些活儿落到指令上是什么样
- 🔵 计算机基础 · 索引 — 硬件底层的入门课
- ⚙️ 程序是怎样跑起来的 · 索引