Войти
ПрограммированиеФорумГрафика

createDeviceEx зависает

#0
(Правка: 13:09) 13:09, 22 мар. 2020

Привет всем!

Имеется код на C#, который использует DirectX через обёртку SharpDX. Этот код нужен чтобы отображать DirectX-битмапы в WPF-интерфейсе без перекачки данных в ОЗУ и обратно.

Всё работает хорошо, при запуске устройство создаётся, буферы отображаются и т.п. Но если компьютер уснёт, или параллельно открыть что-либо, использующее видеокарту, например, Photoshop или 3ds max, банально нажать Ctrl+Alt+Del, или даже просто сделать что-то, что спровоцирует вопрос UAC, то происходит пересоздание устройства DirectX в основном потоке, и на функции createDeviceEx он виснет:

            ComInterface.IDirect3DDevice9Ex obj = null;
            int result = -1;
  

            result = this.createDeviceEx(this.comObject, Adapter, DeviceType, hFocusWindow, BehaviorFlags, pPresentationParameters, pFullscreenDisplayMode, out obj);


            if (result != 0)
                new Exception($"Ошибка в {nameof(createDeviceEx)} в {nameof(Direct3D9Ex)} в {this}: не удалось пересоздать устройство DirectX").ThrowVoid();

            Marshal.ThrowExceptionForHR(result);
            return new Direct3DDevice9Ex(obj);

Слышал, что это какая-то известная проблема DirectX 9, и что она решается только переходом на 10/11/12, и никак иначе. Так ли это? Как вообще решить эту проблему?

Я вот, например, обнаружил, что если на строчку int result = -1 повесить бряк, словить его, потом через 3 секунды сделать шаг вперёд - выделится createDeviceEx , потом еще через 3 секунды сделать шаг, то функция отработает нормально. Однако, если навтыкать туда слипов, или даже await Task.Delay(3000), то эффекта нет - оно зависает. Получается только с бряками. Но зацепка есть.

Ось Win 8, GeForce 780


#1
15:00, 22 мар. 2020

Я не эксперт. В DX9 была проблема с потерей устройства при всяких свертываниях и прочем. Ее устранили в DX 10 и выше. Также в DX9 добавили IDirect3DDevice9Ex, который также решает эту проблему, НО доступен он только на Win Vista и выше.
Вроде так.

#2
16:44, 22 мар. 2020

Стоп. Я же вроде как раз использую IDirect3DDevice9Ex. Значит, либо я его неправильно использую, либо он не работает. По крайней мере у меня

#3
20:51, 25 мар. 2020

Протестил - параметры на вход функции и в случае корректной работы, и в случае зависания отправляются одинаковые

#4
2:36, 26 мар. 2020

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

ПрограммированиеФорумГрафика