【问题标题】:Multiple Direct3D 9 devices and Alt-tabbing多个 Direct3D 9 设备和 Alt-tabbing
【发布时间】:2013-02-21 23:40:50
【问题描述】:

我有一个应用程序可以在全屏模式下创建 Direct3D 9 设备,然后开始演示。稍后,在创建了第一个设备之后,我在窗口模式下临时创建了一个新的 Direct3D 设备(在同一线程上,但用于不同的窗口)。我再次立即销毁此设备,但不知何故,我不再能够从全屏应用程序中按 Alt-tab。应用程序只是停留在顶部而不是掉到后台,尽管看起来应用程序不再是焦点。

如果我将我的临时设备创建为 D3DDEVTYPE_NULLREF,我突然可以使用 Alt-tab 退出。有谁知道为什么会这样,如果是这样,我如何在不破坏现有设备的情况下创建第二个临时设备?

【问题讨论】:

    标签: fullscreen direct3d9


    【解决方案1】:

    当您创建 D3D 设备时,您指定将其绑定到哪个窗口(@98​​7654321@ 调用的第三个参数)。我可能会建议破坏第二个设备以第一个设备看不到的方式转移焦点。尝试将焦点显式返回到主窗口:

    second_device->Release();
    SetActiveWindow(hWnd);
    

    顺便说一句,如果这是您进行并行渲染的方式,请考虑使用渲染目标或交换链。 DX9 文档说,在设备之间切换会严重影响性能。

    【讨论】:

    • 我在想它也可能会以某种方式弄乱全屏窗口上的窗口样式。我会试试 SetActiveWindow。不,我不使用第二台设备进行任何渲染。我只需要 IDirect3DDevice9(及其虚拟表)用于挂钩。
    • 遗憾的是,这并没有什么不同。
    • 好吧,在阅读了有关创建多个设备的更多信息之后,还有另一个想法:第二个设备设置了与第一个不兼容的协作级别。您可以通过在创建第二个设备时指定 D3DCREATE_NOWINDOWCHANGES 或在销毁第二个设备时显式调用 SetCooperativeLevel 来避免这种情况。
    • 感谢您阅读更多内容,real4x。不幸的是,设置 D3DCREATE_NOWINDOWCHANGES 没有做任何事情,而且 Direct3D 9 不存在 SetCooperativeLevel() (据我所知)。我在这里不知所措。
    【解决方案2】:

    在创建第二台设备后尝试重置第一台设备。 MSDN 提到这是初始化多个设备的正确方法。但是我找不到关于它的文章:(

    虽然我从来不需要制作全屏和窗口设备。我只尝试过两个全屏设备。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多