几个Direct3D设备和Intel GMA945

Kir*_*sky 2 c++ directx graphics windows-xp direct3d

我创建了16个Direct3D设备,大小约为320x200像素.我每40毫秒在一个单独的线程中为每个设备调用IDirect3DDevice9 :: Present.如果显示系统工具提示或开始菜单,则在使用Windows XP和集成英特尔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;
Run Code Online (Sandbox Code Playgroud)

jal*_*alf 5

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

创建16个设备并试图让它们并行渲染只是寻找麻烦.D3D的设计基于这样的假设:任何时候只有一个设备会进行严格的渲染.

从理论上讲,差异应仅仅是性能问题,但在您的情况下,尝试在糟糕的英特尔GPU上并行运行16个设备,如果它导致渲染错误(如您看到),我不会感到惊讶.