【问题标题】:Initializing D3D9 causes a 3rd-party library to stop working初始化 D3D9 会导致第 3 方库停止工作
【发布时间】:2011-06-26 20:51:16
【问题描述】:

首先,一般情况...通过 DLL 加载的第 3 方库会渲染到 HWND。它是简单的 2D 渲染,并没有以我可以看到的方式直接使用 D3D - DLL 上的依赖遍历显示了许多 D3DKMT 函数,例如 D3DKMTCreateDevice,但不是像 IDirect3D9::CreateDevice 这样的常规 D3D 调用。 当我打电话给IDirect3D9::CreateDevice 时,第 3 方渲染变得很糟糕。它不会抱怨,只是将所有内容呈现为黑色矩形。我自己的渲染效果很好。

细节...第 3 方 DLL 是 Mozilla XULRunner 1.9.x,它是 FireFox 的核心(不是具有硬件加速功能的 2.0),包装在 wxWidgets wxWebConnect 库中。 wxWC 加载 XUL DLL 并提供 Web 浏览器 GUI 组件。

我在这里有一个使用 wx 和 wxWebConnect 的工作应用程序,一个已编译的 EXE 和代码: http://www.kirix.com/forums/viewtopic.php?f=25&t=911#p2605

这是我的真实代码,它略微绑定到 wxWidgets,但不足以使其难以阅读 - 我从随机窗口获取 HWND 只是为了初始化 D3D,但从不渲染它:

void MyFrame::OnD3DButton( wxCommandEvent &event )
{
    static bool initialized = false;
    static LPDIRECT3D9 mpD3D = NULL;
    static LPDIRECT3DDEVICE9 mpD3DDevice=NULL;
    if(!initialized)
    {
        wxButton *button=wxDynamicCast(event.GetEventObject(), wxButton);
        HWND mHWnd = (HWND)button->GetHandle();
        mpD3D = Direct3DCreate9(D3D_SDK_VERSION);

        D3DPRESENT_PARAMETERS md3dpp;
        ZeroMemory( &md3dpp, sizeof(D3DPRESENT_PARAMETERS) );
        md3dpp.Windowed                 = true;
        md3dpp.SwapEffect               = D3DSWAPEFFECT_DISCARD;
        // triple buffer if VSync is on
        md3dpp.BackBufferCount          = 1;
        md3dpp.EnableAutoDepthStencil   = 0;
        md3dpp.hDeviceWindow            = mHWnd;
        md3dpp.BackBufferWidth          = 0;
        md3dpp.BackBufferHeight         = 0;
        md3dpp.FullScreen_RefreshRateInHz = 0;
        md3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
        md3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
        md3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
        md3dpp.MultiSampleQuality = 0;

        HRESULT hr = mpD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,mHWnd,
            D3DCREATE_MULTITHREADED|D3DCREATE_MIXED_VERTEXPROCESSING,&md3dpp,&mpD3DDevice);
        if(FAILED(hr))
            wxMessageBox(wxString("mpD3D->CreateDevice() FAILED"));
        else
        {
            wxMessageBox(wxString("mpD3D->CreateDevice() SUCCEEDED"));
            initialized = true;
        }
    }

}

【问题讨论】:

    标签: c++ dll wxwidgets xul direct3d


    【解决方案1】:

    问题可能是 CreateDevice 将修改 FPU 状态,除非您传递标志 D3DCREATE_FPU_PRESERVE。当它咬我时,我花了很长时间才找到它。

    【讨论】:

    • 这很可能是问题所在。这是一个痛苦的问题。
    • 哦,天哪,我只是为了把它从列表中划掉才试过这个,它成功了!我不知道为什么它会搞砸网络渲染引擎,但你去吧。现在我该怎么处理这些信息?
    • 原因是它会搞砸任何使用浮点运算的东西。
    【解决方案2】:

    您是否使用与第 3 方 dll 使用的相同的 hwnd 创建 D3D 设备?

    在这种情况下,第 3 方软件可能仍在绘制它的东西,但 direct3d 只是在它上面渲染,所以您只能看到 d3d 输出。

    【讨论】:

    • 不,一个单独的。另外,我没有进行 any 渲染。我只打电话给Direct3DCreate9CreateDevice,就是这样。
    • 如何创建设备?你能发布参数吗?你有调试吗?也许日志中有一些东西表明 createdevice 有问题
    • 您使用的是 WindowsXP、Vista 还是 7?您是在创建 D3D9 设备还是 D3D9EX 设备??
    • 我为 wxWebConnect 论坛提供了一个示例,其中包含我的 D3D 代码。请参阅此处附件下载:kirix.com/forums/viewtopic.php?f=25&t=911#p2605
    • 尝试将 BackBuffer 的宽度和高度设置为某个特定的大小,如果您只将其设置为 0,则不设置屏幕刷新率或多重采样质量等内容。也许还可以尝试更改以使用 D3DCREATE_SOFTWARE_VERTEXPROCESSING 创建设备。正如你所说,只有在创建 d3d 设备时一切都会变得一团糟,我猜这些设置不能很好地相互配合,或者把 3rdparty 的东西弄乱了,尽管我很难理解为什么会这样
    猜你喜欢
    • 2022-10-20
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多