【问题标题】:DirectX Resize shows win32 background at EdgesDirectX Resize 在边缘显示 win32 背景
【发布时间】:2020-11-15 15:46:00
【问题描述】:

在 DirectX 中缩小尺寸时,我注意到底部/右侧边缘闪烁。

如果您修复了交换链的大小(红色),并将 win32 背景设置为绿色,您将在调整大小时得到以下结果:

似乎窗口大小落后于鼠标位置(“拖动矩形”),但 DirectX 填充的区域(红色和黑色)与拖动矩形匹配,其余部分将使用窗口背景颜色(绿色)绘制.

DirectX Utility Toolkit (DXUT) 没有这个问题。试验他们的设置,我发现设置 DXGI_SWAP_CHAIN_DESC::SwapEffect = DXGI_SWAP_EFFECT_DISCARD 只会在 sizemove 期间将屏幕涂成绿色(窗口背景颜色)。我假设 DXUT 对 win32 输入 modal sizemove loop 以在 sizemove 期间显示 DirectX 内容时有自己的特殊处理。

DXGI_SWAP_EFFECT_DISCARD 是old blit mode presentation model 的一部分。值得注意的是它不能有DXGI_SWAP_CHAIN_DESC1::Scaling = DXGI_SCALING_NONE 缩放必须拉伸到窗口大小。所以我最好的猜测是这种行为是由于翻转演示模型的实现(它翻转了一个太小(黑色)的矩形,然后通过将其余部分涂成绿色来覆盖)。

有谁知道如何阻止win32背景显示?


编辑:

感谢 IInspectable!我可以确认WS_EX_NOREDIRECTIONBITMAP 扩展样式有效:它会阻止工件从 win32 背景显示

【问题讨论】:

标签: winapi resize directx window-resize dxgi


【解决方案1】:

在使用 CreateSwapChainForComposition() 和 DirectComposition 时,我重现了与使用 CreateSwapChainForHwnd() 时完全相同的行为。

这意味着像素到达屏幕有两条路径。绿色像素正在通过重定向表面。因此,显式请求WS_EX_NOREDIRECTIONBITMAP 可以防止任何通过重定向表面停止显示win32 背景的绘图。

另一条路径是翻转呈现行为,即如何显示红色和黑色像素。因此,在调整大小时不使用翻转呈现也会停止显示 win32 背景。

DWM 一定有一个错误:当存在重定向表面时,用于防止交换链内容延伸超出窗口的剪辑小于重定向表面,从而可以沿底部/右边缘看到它。

有两个有趣的观察结果:

  1. 当使用WS_EX_LAYOUTRTL 或使用IDCompositionVisual 手动将IDCompositionVisual 定位到屏幕的右边缘GetClientRect() 时,交换链内容的位置正确,但仍被剪裁。
  2. 当使用WS_EX_NOREDIRECTIONBITMAP 时,窗口的非客户区与交换链的内容对齐,而不是被剪切的交换链内容

这些观察结果似乎暗示问题的原因是 DWM 有时使用它的首选大小作为窗口大小,有时使用重定向表面的大小。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
  • 2022-01-22
  • 2015-10-23
  • 2012-01-05
相关资源
最近更新 更多