1

我正在寻找为应用程序窗口(边框半径和阴影)创建自定义圆角框架从性能的角度来看,最好的技术是什么?

一个。对圆形应用程序窗口使用区域 (SetWindowRgn),对阴影使用分层窗口 (UpdateLayeredWindow)。

湾。对圆形应用程序窗口和阴影使用分层窗口。

UpdateLayeredWindow的文档指定:

为了通过分层窗口和任何底层窗口获得最佳绘图性能,分层窗口应尽可能小。

我专门针对应用程序主窗口提出这个问题,因此一个大窗口可能具有很高的复杂性并且大部分时间都在屏幕上可见。

我应该为应用程序窗口选择区域还是分层窗口?哪一个会在 CPU/内存上更轻?

4

1 回答 1

3

SetWindowRgn禁用给定窗口的 DWM。DWM 是负责使用可用图形硬件高效绘制窗口框架的组件。这应该几乎可以排除SetWindowRgn。此外,SetWindowRgn由于无法进行抗锯齿,因此会产生非常“古老”的效果。一个像素可以是完全透明的,也可以是完全不透明的。

为了通过分层窗口和任何底层窗口获得最佳绘图性能,分层窗口应尽可能小。

我相信在 2018 年,这个提示不太重要。该文档是 18 年前编写的,当时硬件比今天更加有限。

尽管如此,UpdateLayeredWindow这并不是绘制自定义窗口框架的最快方法,尤其是当您必须经常更新位图时(例如在窗口调整大小期间)。瓶颈是这些更新必须从系统内存到图形内存。要最小化窗口大小,请创建四个小窗口,它们的大小仅足以绘制窗口的边框/角。例如,这个技巧是由 Visual Studio 提供的。使用 Spy++ 可以看到 4 个“VisualStudioGlowWindow”实例,它们是仅 9 像素宽/高的分层窗口(在我的系统上):

在此处输入图像描述

如果您想要获得最佳性能,您还可以查看Direct Composition以及WS_EX_NOREDIRECTIONBITMAP 扩展窗口样式,如“使用 Windows 组合引擎的高性能窗口分层”一文中所述。该技术至少需要 Windows 8。

于 2018-01-26T08:27:29.957 回答