【问题标题】:Several Direct3D devices and Intel GMA945几个 Direct3D 设备和 Intel GMA945
【发布时间】:2011-01-14 10:43:38
【问题描述】:

我创建了 16 个大小约为 320x200 像素的 Direct3D 设备。我每 40 毫秒在一个单独的线程中为每个设备调用 IDirect3DDevice9::Present。在装有 Windows XP 和集成 Intel GMA945 显卡的笔记本电脑上,如果显示系统工具提示或开始菜单,则设备的一部分不会更新。 IDirect3DDevice9::Present 在那一刻没有返回任何错误代码,在程序中一切看起来都很好,但用户可以看到几个设备上的移动冻结。这可能是什么原因?

这在具有相同硬件的 Windows 7 和具有不同硬件的 Windows XP 上都可以正常工作,因此只有这种组合会出现问题。我应该支持这一点,因为我的客户正在使用这种硬件和操作系统的组合。 MSDN 没有说我应该只创建一个 D3D 设备(至少我找不到它)所以问题应该出在其他地方。

我试图找到的是,可能有一些标志组合可以解决我的问题。目前我使用以下内容:

D3DPRESENT_PARAMETERS param = {};
param.Windowed = TRUE;    
param.SwapEffect = D3DSWAPEFFECT_DISCARD;   
param.hDeviceWindow = GetSafeHwnd();
param.BackBufferCount = 1;
param.BackBufferFormat = D3DFMT_UNKNOWN;
param.BackBufferWidth = m_szDevice.Width;
param.BackBufferHeight = m_szDevice.Height;
param.MultiSampleType = D3DMULTISAMPLE_NONMASKABLE;
param.Flags = D3DPRESENTFLAG_VIDEO;
param.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
param.MultiSampleType = D3DMULTISAMPLE_NONE;
param.MultiSampleQuality = 0;

【问题讨论】:

    标签: c++ graphics windows-xp directx direct3d


    【解决方案1】:

    不要那样做。该设备应该基本上以一对一的方式映射到 GPU。创建一个设备,并使用它来绘制到 16 个不同的窗口,无论哪种方式适合您。 (多交换链是通常的方法,afaik)

    创建 16 台设备并尝试让它们并行渲染只是 自找麻烦。 D3D 的设计是基于这样一个假设,即任何时候只有一台设备会进行认真的渲染。

    理论上,差异应该只是性能问题,但在您的情况下,尝试在蹩脚的英特尔 GPU 上并行运行 16 台设备,如果它导致渲染错误,例如您,我不会感到惊讶看到。

    【讨论】:

    • 这实际上并不只适用于操作系统和硬件的一种组合,那么为什么我不应该这样做呢? MSDN 对此没有任何反对意见。使用 16 个独立的设备使我的项目架构更加清晰。如果不进行大量重构,我无法更改它。
    • @Kirill:我现在找不到它,但 MSDN 确实 反对它(我从那里学到的)。但与 MSDN 一样,您必须知道在哪里查找。等我有空的时候看看能不能找到。
    【解决方案2】:

    我已经分发 DirectX 软件几年了,在此过程中了解到英特尔图形芯片组的驱动程序非常糟糕。有一次我什至看到无法正确渲染四边形的驱动程序修订版。因此,当您遇到 Intel 芯片组问题时,如果您使用的是最新的驱动程序版本,您几乎必须接受您的解决方案将是“开始使用shot弹枪破解事物,直到它起作用为止”。

    很抱歉给你一个蹩脚的答案,但英特尔芯片组根本没有经过精心设计。他们只是为了在屏幕上获得一些东西——任何东西——可能是为办公室工作人员使用的。除了“它做航空玻璃吗”之外,英特尔可能并不关心它做了什么或它的工作效果如何。另一种“解决方案”是无论如何分发您的应用程序,声明由于硬件/驱动程序支持中的故障不支持英特尔芯片组,然后联系英特尔,看看您是否可以从他们那里获得修复。

    而且人们说 OpenGL 的驱动程序不好......

    【讨论】:

      【解决方案3】:

      首先,当您说“此时不返回任何错误代码”时,您是否在最大调试级别运行 D3D9 调试版本?

      其次,每次创建新设备并获得焦点时,所有现有设备的表面都会丢失。您是否在创建后对它们中的所有个进行重置?

      除此之外,就像其他答案状态一样:不要从单个应用程序创建多个设备。设备创建可能会在 9 或 10 个设备之后开始引发错误,您实际上是在使用 16 个设备来推动它。请改用具有多个交换链的单个设备,例如,请参阅此 DirectX 8 教程。

      【讨论】:

      • 是的,我用调试版测试过。以及为什么我不应该创建 16 台设备,MSDN 对此一言不发。
      • @Kirill:你不应该这样做,因为你会遇到错误,即使你没有,遇到 GPU 或驱动程序也只是时间问题未能处理 16 台设备。 ;)
      【解决方案4】:

      英特尔图形芯片,尤其是集成 GMA 芯片,从未因其功能而闻名。他们可以报告他们没有的上限,然后失败,有或没有错误代码(有错误报告,据说支持的着色器模型后来编译失败)。您可能会遇到与他们的芯片/驱动程序类似的问题。它是否适用于其他硬件或不同的驱动程序?

      我假设,由于拥有多个设备,它们是窗口化的?您是否检查过窗口句柄,或尝试在呈现时显式传递句柄/视口?是否有任何设备被重置?

      在显示工具提示或开始菜单后,显示驱动程序可能没有正确地重新绘制窗口(如果它是工具提示/菜单下的窗口,则更有可能)。您是否检查了窗口的焦点,确保它被绘制等?

      【讨论】:

      • 检查窗口句柄是什么意思?
      • 设备或当前参数中使用的HWND。虽然,正如其他人提到的,16 台设备并不是一个好主意。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多