D3D / DXGI处理全屏过渡


9

我有一个D3D11应用程序,我想添加适当的全屏支持。现在,我可以让DXGI为我将窗口切换到全屏状态,并且给人的印象是DXGI会处理使交换链翻转前后缓冲所需的一切,而不是消隐它们。

但是,在多监视器设置中,让DXGI执行切换似乎不可靠-切换大量时间后,辅助屏幕完全保持黑色,没有明显的原因或模式。

它可以采取几次来回切换之前,我全屏窗口桌面的其余部分显示的其他屏幕上。

显然我并不孤单,《战地风云3》和《魔兽世界》似乎对很多人都有类似的问题。

现在,真正的问题是:我猜想,即使是那些AAA游戏开发公司也无法做到这一点,所以我最大的希望是自己以某种方式执行全屏切换。

我有什么办法可以将窗口/交换链提升为适当的,缓冲区翻转的全屏模式?


在撰写本文时,当前版本的《魔兽世界》不再具有您提到的显示模式配置问题/内存泄漏。他们当然是有问题的,但是从7.3.2开始已解决
-Gazer

Answers:


3

据我所知,唯一起作用的是:

 DwmEnableComposition(DWM_EC_DISABLECOMPOSITION);

在您的应用程序开始时:

DwmEnableComposition(DWM_EC_ENABLECOMPOSITION);

退出之前。对于过渡,请照常进行。InvalidateRect(NULL, NULL, true)切换到全屏显示后,我尝试了一下,但无济于事。希望这可以帮助。


经过一切尝试,看来您是正确的。只有禁用合成才能可靠地防止这种情况的发生。不是我希望的答案,而是总比没有好。

请注意,Windows 8.1和更高版本会忽略此设置。您不能禁用DWM。
查克·沃尔本

1

并非唯一面临这个问题的人。首先要检查:确保您使用的视频卡使用最新的/ beta /一流的驱动程序。

现在,我要说的是,使这种方法比自动DXGI实现更好地工作的可能性很小。这种问题高度依赖于适配器供应商,驱动程序版本和监视器配置。因此,通过将其固定在一台机器上,您可能最终会在更多机器上损坏它。

我建议不要回到DirectX 9的黑暗时代,在该时代您必须手工完成所有事情。一个更好的主意是尝试修复自动切换。一些要遵循的线索:

  • 仔细阅读(稀疏)文档

  • 如果您尚未这样做,请尝试对WM_SIZE从全屏切换到全屏时收到的事件做出响应,如此处所述。如果这样做,请确保在调用之前正确释放了对后缓冲区的所有引用ResizeBuffers如此处所述。否则可能会导致此类奇怪的半问题。

  • 尝试直接以全屏模式启动,并使用一种枚举的显示模式创建交换链。如果这始终有效,则可能意味着您在处理时未使用枚举显示模式之一WM_SIZE(或者并非完全如此,诸如刷新率之类的事情可能很重要)。

  • 尝试对交换效果和交换链描述的缓冲区数进行摸索。你或许应该使用DXGI_SWAP_EFFECT_SEQUENTIALBufferCount> = 2,也许你的驱动有更多的“异国情调”的选项的支持比较差。


调整缓冲区大小可以正常工作。我还尝试了所有交换效果,它们似乎没有什么不同,并且我一直使用2个缓冲区。我会尝试全屏操作,(即使我不知道“使用一种枚举的显示模式”是什么意思,当我响应WM_SIZE时,我所做的只是ResizeBuffers,无处可传递显示模式作为参数),但我自发安装了Windows 8,然后猜猜是什么,我现在无法复制问题

回到Windows7,从一开始就尝试在全屏模式下创建交换链,但是问题仍然存在。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.