四川省建设厅官方培训网站seo关键词排名注册价格
对于 Windows 上的所有图标而言,它的宽度总是8的倍数,这可不是因为人们喜欢2的幂,虽然在计算机世界,你会看到很多这样的数字,例如,1024,4096等。
在 Windows 的早期阶段,大多数显卡是单色的,如果幸运的话,可能会有一张16色的显卡。它们运作在平面视频模式(planar video mode)。现在我们想象一下,将一张位图拷贝到屏幕上,这张位图和屏幕都是平面化的。
如果目标矩形的起始坐标刚好8的倍数,则位图可以通过块拷贝指令进行复制。换句话说,如果目标矩形的坐标不是8的倍数,则你需要做很多复杂的工作来对位图进行移动,从而显示到屏幕上。
这就是窗口风格 CS_BYTEALIGNCLIENT 被创建出来的原因。当把这个风格设置到窗口上时,窗口管理器将尝试定位窗口,以便客户端矩形左上角的 X 坐标位于视频内存的完美字节边界。
如果你以 1bpp 视频模式(单色或 16 色)运行,这意味着 x 坐标是 8 的倍数。通过以这种方式定位窗口,复制到客户端矩形左上角的位图将通过快速块传输指令进行复制。
如果你查看 Windows 95 或更早版本的对话框尺寸,你会发现它们的宽度几乎总是 32 个 DLU 的倍数。由于四个水平 DLU 等于一个平均字符宽度,因此你必须将对话框宽度保持为 32 的倍数,以确保最终对话框大小是 8 的倍数。
保持位图宽度以表示确切的字节边界对于当今机器的性能非常重要。复制周围的像素块通常分三个主要步骤执行:从位图左边缘到第一个字节边界的细垂直条带,然后是位图的大部分到最后一个字节边界,最后是从最后一个字节边界到右边缘的细垂直条带。如果你睁大眼睛,你实际上可以看到这三个阶段的绘画正在发生。(就像我说的,当时的机器并没有那么快。)保持字节对齐和字节宽度意味着两个细的垂直条带的宽度为零,因此可以优化出来。
当然,在当今 32bpp 显示器的世界中,所有这些旧的设计考虑在很大程度上都是无关紧要的。
总结
最近我确实在做一些和位图有关的研究,相比上古时代的单色或16色位图,32bpp(32位的位图)在处理起来,确实十分方便和直观。你可以在脑海你直接呈现位图,不需要考虑颜色板,压缩格式等这些劳什子。
对于数学一窍不通的我来说,属实是救星一枚。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Why are icons multiples of 8 pixels in width?》