c++ - DirectX9 窗口在运行时调整大小而无需设备重置

标签 c++ winapi directx directx-9

在: C++\Win32 application (not in fullscreen)\DX9

如何在调整大小时快速且足够好地重绘窗口内容? Resize == user drag window border.

不同的方法:

  • 在每个 WM_SIZE\WM_PAINT 上重置设备。足够的分辨率,但黑色条纹出现在快速高档。
  • 在 WM_EXITSIZEMOVE 上重置设备并在 WM_ENTERSIZEMOVE 上暂停渲染。速度最快,但在调整大小时出现丑陋的黑色条纹。
  • 在这种情况下找不到如何使用 dx9 的交换链
  • 在调整大小时保持渲染和交换缓冲区;在 WM_EXITSIZEMOVE 上重置。正是 2010 SDK 的官方演示中发生的情况。看起来很快并且可以接受很好。但是 [突然] 在慢速计算机上再次出现黑色条纹。薄而稀有,但真实。实际上,那很奇怪:乍一看,每个 WM_SIZE 和/或 WM_PAINT 上的同步渲染和 Present(,,,) 排除了这一点。在第二个。也许我不明白一些重要的事情?

所以,当最后一个方法失败时,我决定在这里问。是否有可能以某种方式使 dx9 表面牢固地粘在窗口边框上。没有黑色条纹。更喜欢降低比例速度,但以某种方式与 DX 同步。

最佳答案

我为窗口的最大客户端大小分配了一个足够大的后备缓冲区,并在 WM_SIZE 上设置了一个与当前窗口客户端大小相匹配的视口(viewport)。然后我渲染以响应。仅从该视口(viewport)呈现。这样就不需要重置设备。

关于c++ - DirectX9 窗口在运行时调整大小而无需设备重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19596084/

相关文章:

c++ - qInstallMessageHandler 不接受公共(public)方法作为参数

c++ - 从 C C++ 中的文件中读取矩阵

winapi - 使用 Win32 查看文件夹

c++ - 是否可以更改不受您控制的 dll 的默认线程堆栈大小 c++ win32

C#:无法创建 DirectX 设备。硬件类型或软件类型均无效

c++ - 尝试在 OpenAL 中播放某些内容,但它永远不会脱离 AL_INITIAL 状态

c# - 如何使用 Win32 API 在与 LocalSystem 帐户不同的帐户下安装服务?

c++ - 使用矩阵、欧拉角和/或四元数进行旋转表示的优缺点是什么?

c++ - 重新分发 d3dcompiler_47.dll 时缺少 api-ms-win-core-libraryloader-l1-2-0.dll

c++ - Boost.Spirit、Nabialek 技巧和错误处理