0

我的应用程序使用 C++/CLI 类,该类扩展System.Windows.Forms.UserControl和包装了原生 C++ 类,该类使用效果框架进行 Direct3d9 渲染。在我们将解决方案从 VS2010 SP1 升级到 VS2012 之前,一切都运行良好。

在生产机器中,应用程序运行良好,甚至比以前快一点。但是在调试时,我随机得到两个可能的错误之一:

  1. LockRect对纹理的调用永远被阻止
  2. C:\Windows\SysWOW64\nvd3dum.dll我在版本中遇到访问冲突9.18.13.3182

我使用的是 Windows 7 Ultimate,64 位,所有最新更新。我正在使用由双头 Nvidia GeForce 210 GPU 提供的双显示器设置(一个来自 VGA 输出,另一个来自带有 DVI 到 VGA 适配器的 DVI)。

由于这似乎是图形适配器的问题,我所能想到的就是将 Nvidia 驱动程序升级到最新版本。这只会使错误更加频繁,使我的开发箱无法用于调试。我的同事有类似的环境,根本没有遇到这个问题。

也许GPU有一些物理损坏?我该如何检查?关于解决此问题的任何其他提示?

4

1 回答 1

0

在研究LockRect块问题时,我偶然发现了许多声称 Direct3D9 默认情况下不是线程安全的说法。

那点击了我。最近,我们并行化了一些直接更新纹理数据的原生代码(即不分派)。所以有并发调用LockRect. 人们说那Present是危险的调用,但我尝试设置CreateDevice D3DCREATE_MULTITHREADED行为标志,瞧,现在我正在顺利调试,没有更多的崩溃或死锁。

警告:据说激活多线程标志会引入显着的性能开销,但在我的情况下,它可以忽略不计(我正在从图像采集卡进行实时视频)。

于 2013-12-09T21:16:38.380 回答