[英]What do CS_BYTEALIGNCLIENT and CS_BYTEALIGNWINDOW mean?
我很难理解这两个class styles 。 文档说他们在字节边界上对齐 window,但我不明白那是什么意思。
我试过使用它们,是的,创建时 window 的 position 是不同的,但我不清楚它们的作用以及我为什么要使用它们。
它们有什么作用,我为什么要使用它们?
使用现代显示技术和 GPU,它们(可能)在性能方面做得很少。
然而,在过去,(可能很慢的)CPU 需要直接写入 RAM 块来显示 memory。在这种情况下,显示器和/或 bitmap 的“颜色深度”小于一个字节——如单色(每像素 1 位)和低颜色(比如 4 bpp)——windows 和它们的客户端可以对齐,这样每一行就不会“对齐”到实际的字节边界; 因此,块复制操作(如BitBlt
)会非常慢,因为每行的前几个像素必须根据第一个字节中的某些位手动设置显示 memory 中的某些位源(RAM)。 这些缓慢的操作也将沿每一行传播。
强制显示(无论是客户区还是整个window )使其 x 原点(那些标志/样式只影响 x 位置)对齐到真正的字节边界允许更快的复制,因为然后会有一个直接源(RAM)中的字节与目标(显示器)中的字节之间的对应关系; 因此,可以执行一行字节的简单块复制(使用类似于memcpy
的东西),而不需要对来自不同字节的各个位进行任何操作。
作为一个模糊的类比,考虑以下两者之间的差异(在速度和简单性方面):(a)将一个n字节的数组复制到另一个相同大小的数组; (b) 用一个源元素的低 4 位与下一个源元素的高 4 位的组合替换第二个数组中的每个字节。
来自为什么 Windows 95 保持 window 坐标为 8 的倍数? 陈雷蒙:
屏幕本身是一个巨大的 bitmap,这意味着如果目标的 x 坐标位于一个完整的字节边界上,则将数据复制到屏幕上的速度要快得多。 最常见的 x 坐标是窗口内容的左边缘(称为客户区)。
应用程序可以通过在其 window class 中设置 CS_BYTEALIGNCLIENT 样式来请求 Windows position 他们的 windows 以便他们的客户区从这些有利坐标开始。几乎所有应用程序都这样做是因为它产生的性能优势。
那么在 Windows 95 之后发生了什么使得这个优化 go 消失了?
哦,优化还在。 您今天仍然可以设置 CS_BYTEALIGNCLIENT 样式,系统会遵守它。
改变的不是 Windows。改变的是你的视频卡。
Windows 95时代,主流显卡是VGA(Video Graphics Array)和EGA(Enhanced Graphics Adapter)。 还支持较旧的图形卡,例如 CGA(彩色图形适配器)和单色 HGC(Hercules 图形卡)。
所有这些图形卡都有一个共同点:它们使用一种像素格式,其中多个像素在一个字节中表示,因此提供了一个环境,其中字节 alignment 导致某些 x 坐标成为不合格的位置。
升级显卡并将颜色分辨率设置为“256 色”或更高后,每个像素至少占用一个完整的字节,² 因此 x 坐标字节对齐的要求得到了空洞的满足。 每个坐标都符合条件。
现在所有的显卡都使用32位的颜色格式,所有x坐标都满足坐标对齐字节偏移的要求。³8的倍数不再特殊。
问题未解决?试试以下方法:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.