2-й вызов Device.Reset в DirectX создает исключение InvalidCallException - PullRequest
3 голосов
/ 13 января 2009

Я работал над приложением DirectX на C # и заметил, что когда я блокирую рабочую станцию, DirectX «Устройство» теряется. После просмотра информации о том, что делать, когда устройство потеряно (и когда Device.Present выбрасывается *1002*), я переписал код для сброса Device. Это просто означало, что я позвонил Device.Reset.

Вызов Device.Reset восстановил Device. Нет проблем. Но когда я потерял устройство во второй раз (например, когда компьютер был заблокирован, перешел в спящий режим или активировал экранную заставку), исключение было выдано Device.Reset.

Исключением было InvalidCallException, что (согласно документации) означает, что с вызовом что-то пошло не так. Поэтому я предположил, что это проблема с аргументами функции. Таким образом, вместо передачи той же копии PresentParams, которую я использовал для создания устройства, я создал новый экземпляр PresentParams (сначала с помощью конструктора копирования, а затем путем повторного создания без него) и передал его Device.Reset .

Не работает. Device.Reset все еще умирает с InvalidCallException. Ох, а сообщение об исключении? «Ошибка в приложении». Не полезно.

Можете ли вы указать мне направление или решение, или некоторую документацию о том, как получить больше отладочной информации из DirectX?

1 Ответ

3 голосов
/ 19 января 2009

Хорошо, я знаю, как глупо, кажется, отвечает на мой собственный вопрос, но я подумал, что кому-то еще это может понадобиться, а?

Ответ - : было слишком много вызовов метода Dispose из VertexBuffer s на сцене. Причина в том, что внутренние обработчики сброса Device вызывали метод Dispose. И почему это случилось? Потому что я забыл прочитать документацию по .NET DirectX SDK, касающуюся перечисления пулов, и выделял VertexBuffer с использованием Pool.Default вместо Pool.Managed.

Очевидно, что после нескольких тысяч плохо выполненных циклов распределения и выделения что-то пошло не так.

О, и как я это обнаружил? Я подключил слушателя к VertexBuffer.Dispose, который увеличил счетчик, который я отображал на экране. Вообразите мое удивление, когда я заметил, что этот счетчик продолжал расти, когда я изменял размеры окна!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...