什么原因导致 Windows XP 延迟屏幕渲染失败?

tot*_*dli 8 windows window rendering windows-xp

我们都知道程序或操作系统本身冻结的情况,您唯一能做的就是使用系统呈现的数百万个对话框进行绘制。我正在谈论这个(演示在这里):

Windows 延迟屏幕

为什么会发生这种情况?为什么我总是只在 Windows XP 上遇到它?这不会发生在 Linux、Mac 或其他 Windows 版本上吗?如果不是,为什么?实际上,这个错误有官方/通用名称吗?

Syn*_*ech 6

这就是所谓的“鬼窗”。发生的情况是进程挂起或死锁,因此无法响应绘制消息以更新其窗口。为了处理这种情况,Windows 接管并绘制窗口,直到程序再次响应并绘制自身(或被杀死或崩溃)。

在旧版本的 Windows 中,冻结窗口的背景颜色是纯色的,但在 XP 中,Windows 会截取窗口的屏幕截图,因为它是上次更新时的屏幕截图,并使用它来绘制它。当然,如果窗口的某些部分被覆盖(比如将它拖到屏幕外),那么 Windows 只能用背景颜色绘制它(这就是为什么在向各个方向拖到屏幕外后,它最终完全是空白的)。

此外,当您将其他窗口拖到它上面时,它们会留下痕迹,因为当它的一部分未被覆盖时,冻结的窗口不会响应绘制消息。

在 Vista+ 中,Windows 仍然会像 XP 中那样绘制幽灵窗口,但它使用了一种技巧,使窗口在某种程度上看起来还活着;您仍然可以移动和最小化它,而不会丢失上次更新的图像或获得镜厅效应。它现在所做的是隐藏实际冻结的窗口,并用一个新的临时窗口替换它,该窗口的大小和形状与冻结的窗口相同。新窗口涂有冻结窗口的屏幕截图,但涂上了淡白色。现在,当您将其他窗口拖到它上面时,它会保留原始(重影)图像,因为它实际上并未冻结;它通过绘制存储的屏幕截图来处理绘制消息。

微软员工Raymond ChenMatt Eason对此进行了很好的介绍。

当然,Mac、Linux 等都以自己的方式处理窗口的绘制和管理,因此它们以不同的方式响应冻结的窗口。