何时应使用WS_EX_NOREDIRECTIONBITMAP?

19

MSDN(扩展窗口样式)指出:

WS_EX_NOREDIRECTIONBITMAP:窗口不会呈现到重定向表面。这适用于没有可见内容或使用除表面之外的机制提供其视觉效果的窗口。

在这种情况下,“窗口呈现到重定向表面”与“使用表面以外的机制”是什么意思?GDI、D3D9、D3D11、D3D12中哪些属于前者,哪些属于后者?我是否应该在只使用Direct3D进行绘图时使用此扩展窗口样式?


6
优化措施是防止创建后备缓冲区。DWM(又名Aero)用于合成UI中窗口到屏幕上。绝不适用于GDI,适用于DirectComposition,可能适用于DirectX。容易判断何时不应使用它,窗口的客户区域将不可见或类似实时缩略图和Aero Peek之类的功能无法正常工作。 - Hans Passant
8
Kenny Kerr在他的文章《Windows with C++ : High-Performance Window Layering Using the Windows Composition Engine》中简要解释了窗口样式的作用。 - IInspectable
2个回答

6

WS_EX_NOREDIRECTIONBITMAP 用于使用 DirectComposition 进行渲染的 Windows。

例如,Sciter 创建具有 WS_EX_NOREDIRECTIONBITMAP 的窗口,以支持类似此处的亚克力组合效果:

enter image description here

这是一个使用DirectComposition和WS_EX_NOREDIRECTIONBITMAP的普通Win32窗口(非UWP)。在这样的窗口上,应该通过Direct2D手段进行渲染。使用WS_EX_NOREDIRECTIONBITMAP时,GDI渲染几乎没有用处。

我尝试了丙烯酸窗口演示,虽然什么也没做,只是显示,但它占用了我的GPU的20%。丙烯酸真的是使用dcomp完成的吗?效果?d2D?桌面复制?也许这不是讨论这个问题的地方。请勿误解,我并不抱怨,只是想理解 :-) - Simon Mourier
“acrylic-window demo”是什么?无论如何,尝试使用sciter SDK中的usciter.exe(https://sciter.com/download/)。它使用WS_EX_NOREDIRECTIONBITMAP和Direct2D / DirectComposition。 - c-smile
我指的是samples\acrylic-window\acrylic-window-sketch.htm文件。我确实看到了亚克力效果(FYI,我尝试使用usciter,它仍然需要约20%的GPU)。我很想知道你是如何在后面的窗口中实现这种亚克力效果的。 - Simon Mourier
啊,那个。那个演示运行动画,因此以60 FPS的频率刷新窗口。但是,在我的机器上,Windows任务管理器显示该演示的GPU负载为3-5%。你说的“在窗口后面使用亚克力效果”是什么意思? - c-smile
我没有专门的GPU(只有一个集成的英特尔显卡),也许这就是原因。我的意思是,你在答案中展示的屏幕截图中所显示的窗口与演示程序混合在一起。 - Simon Mourier

4

DirectComposition是主要的API,可以用于在不使用重定向位图的情况下绘制窗口。在没有DirectComposition的交换链中使用DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL也可能触发此模式。

使用该API时需要注意的一件事情是,窗口背景不一定会是不透明的,因此DWM会与窗口后面的东西混合,这些东西实际上并不可见。


2
你的意思不是指“窗口后面有些东西实际上是看不见的”吗? - Glenn Slayden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接