Нарушение прав доступа на SwapChain.Present

У меня очень неприятная проблема со следующими строками кода:

try{
  mSwapChain.Present(0, PresentFlags.None);    //AccessViolationException, caught by debugger
}catch(Exception Ex){
  throw Ex;  //Debugstop here, but not reached
}

//DeviceContext: SharpDX.Direct3D11.DeviceContext
//mVertexBinding: SharpDX.Direct3D11.VertexBufferBinding

DeviceContext.InputAssembler.SetVertexBuffers(0, mVertexBinding);
DeviceContext.Draw(mNumVertices, 0);

Моя программа запускает таймер, который вызывает событие, если оно возникает и я не выполняю рендеринг в это время, программа вызывает вызов рендеринга. Одновременно запускается другой таймер + события мыши, обновляющие матрицы, вершины, буферы и прочее - но во время рендеринга все эти функции обновления блокируются - но только до достижения DeviceContext.Draw(mNumVertices, 0);, после этого объект синхронизации разблокируется.

У меня вопрос - может ли возникнуть нарушение прав доступа, если VertexBufferBinding изменится между Draw(..) и SwapChain.Present(..)? Или это скопировано? И второй - почему я не могу поймать это нарушение прав доступа? Это всегда «Необработанное исключение».

Изменить: странно, что нарушение доступа появляется только на моем рабочем ноутбуке (Core i5, Intel HD 3000 и Radeon 6490M), но не на моем домашнем ноутбуке (Core i7, Intel HD 3000 и NVidia GeForce 540M).


person lunatix    schedule 19.11.2012    source источник
comment
Глядя на документацию SwapChain.Present: msdn.microsoft.com/en-us/library/windows/desktop/ Похоже, эта функция не генерирует исключение AccessViolationException, так что проблема, как я полагаю, возникла откуда-то еще.   -  person Mike de Klerk    schedule 19.11.2012
comment
каков стек вызовов нарушения прав доступа?   -  person jeroenh    schedule 19.11.2012
comment
Хм ... ты прав ... я искал в коде sharpdx, но думаю, что это автоматически сгенерированная функция ... и у меня нет никакой информации о стеке вызовов, потому что это внешний код ... подробнее тестирование показывает мне, что нарушение доступа чаще всего возникает, если матрицы камеры / объекта часто меняются ..   -  person lunatix    schedule 19.11.2012
comment
@jeroenh: ›BeatCore.dll! BeatCore.DirectX.Common.DxProvider.Swap () Строка 283 C # PaperCraft.exe! PaperCraft.MainWindow.Render () Строка 354 + 0xf Байт C # [Внешний код]   -  person lunatix    schedule 19.11.2012


Ответы (1)


После долгого тестирования он указывает, что эта проблема должна быть вызвана параметром динамической переключаемой графики amd - с принудительной встроенной или максимальной графикой исключение не появляется, поэтому, возможно, это происходит, когда драйвер amd изменяет настройку графического процессора для приложения - как говорится в документации, «графический процессор будет динамически переключаться, если потребуется больше энергии». Так что это было не потому, что я обновил некоторые матрицы или вершины, это было из-за большей мощности, необходимой моей программе при выполнении этих операций (это небольшая программа CAD / моделирования с иерархической геометрией - когда A1 обновляется, AX в AZ имеют тоже нужно пересчитать).

И, может быть, это происходит не в системе NVidia, потому что графический процессор не переключается динамически - он устанавливается при запуске приложения.

person lunatix    schedule 19.11.2012