0

Мое приложение использует класс C++/CLI, который расширяет System.Windows.Forms.UserControl и обертывает собственный класс C++, который обеспечивает рендеринг Direct3d9 с использованием среды Effects. Все отлично работало, пока мы не обновили наше решение от VS2010 SP1 до VS2012.Тупики и сбои при отладке после обновления до VS2012

В производственных машинах приложения работают отлично, даже немного быстрее, чем раньше. Но при отладке, я случайно получить один из двух возможных ошибок:

  1. Вызов LockRect на текстуре остается заблокирован навсегда
  2. Я получаю нарушение прав доступа в C:\Windows\SysWOW64\nvd3dum.dll, версия 9.18.13.3182.

Я использую Windows 7 Ultimate, 64 бит, со всеми последними обновлениями. Я использую настройку с двумя мониторами, питаемую двухъядерным графическим процессором Nvidia GeForce 210 (один от выхода VGA, другой от DVI с адаптером DVI-VGA).

Поскольку это, похоже, проблема с графическим адаптером, все, о чем я мог думать, заключалось в обновлении драйверов Nvidia до их последней версии. Это только сделало ошибки еще более частыми, что сделало мой dev-код непригодным для отладки. У моих коллег сходная среда и вообще не возникает.

Возможно, у GPU есть некоторые физические повреждения? Как я могу это проверить? Любые другие советы по устранению неполадок?

ответ

0

Исследуя проблему с блоком LockRect, я наткнулся на многие утверждения о том, что Direct3D9 по умолчанию не является потокобезопасным.

Это щелкнуло меня. Недавно мы распараллеливали некоторый собственный код, который напрямую обновлял данные текстуры (т. Е. Не отправлял). Таким образом, были одновременные вызовы LockRect. Люди сказали, что Present был опасным вызовом, но я попытался установить флаг поведения CreateDeviceD3DCREATE_MULTITHREADED, и voila, теперь я отлаживаю плавно, больше никаких сбоев или тупиков.

Предупреждение:: Активация многопоточного флага, как говорят, приводит к значительным служебным нагрузкам, но в моем случае это было незначительно (и я делаю видео в реальном времени с захвата кадров).