我的应用程序使用扩展System.Windows.Forms.UserControl
的C ++ / CLI类,并包装使用Effects框架执行Direct3d9渲染的本机C ++类。在将我们的解决方案从VS2010 SP1升级到VS2012之前,一切都很顺利。
在生产机器中,应用程序运行良好,甚至比以前快一点。但是在调试时,我会随机获得两个可能的错误之一:
LockRect
调用永远被阻止C:\Windows\SysWOW64\nvd3dum.dll
版本9.18.13.3182
中收到了访问冲突。我使用的是Windows 7 Ultimate,64位,包含所有最新更新。我使用的是由双头Nvidia GeForce 210 GPU(一个来自VGA输出,另一个来自DVI和DVI-to-VGA适配器)的双显示器设置。
由于这似乎是一个图形适配器问题,我所能想到的就是将Nvidia驱动程序升级到最新版本。这只会使错误更加频繁,导致我的开发盒无法用于调试。我的同事有类似的环境,根本没有遇到过这个问题。
也许GPU有一些物理伤害?我该怎么检查?有关解决此问题的任何其他提示吗?
答案 0 :(得分:0)
研究LockRect
阻塞问题,我偶然发现许多声称默认情况下Direct3D9不是线程安全的。
点击了我。最近,我们并行化了一些直接更新纹理数据的本机代码(即没有调度)。因此有LockRect
的并发调用。人们说Present
是危险的电话,但我尝试设置CreateDevice
D3DCREATE_MULTITHREADED
行为标志,瞧,现在我调试顺利,没有崩溃或死锁。
警告:据说激活多线程标志会带来显着的性能开销,但在我的情况下它可以忽略不计(而且我正在使用帧抓取器进行实时视频)。