【问题标题】:Deadlocks and crashes when debugging after upgrade to VS2012升级到VS2012后调试时死锁和崩溃
【发布时间】:2013-12-06 16:12:13
【问题描述】:

我的应用程序使用 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 有一些物理损坏?我该如何检查?还有其他解决此问题的提示吗?

【问题讨论】:

    标签: winforms visual-studio-2012 nvidia windows-7-x64 direct3d9


    【解决方案1】:

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

    这对我来说很有吸引力。最近,我们并行化了一些直接更新纹理数据的原生代码(即没有调度)。所以有并发调用LockRect。人们说Present 是危险的调用,但我尝试设置CreateDevice D3DCREATE_MULTITHREADED 行为标志,瞧,现在我正在顺利调试,不再出现崩溃或死锁。

    警告:据说激活多线程标志会带来显着的性能开销,但在我的情况下,它可以忽略不计(而且我正在从帧捕获器进行实时视频)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      • 2017-12-28
      • 2019-05-12
      相关资源
      最近更新 更多