2012-03-27 3 views
2

Привет, мне удалось интегрировать графики SlimDX и DirectX 11 в приложение WPF, используя D3DImage и общие текстуры. Однако, но я получаю очень низкую производительность при рендеринге простых сцен (например, GameOfLife в образцах SlimDX) с высоким разрешением (2560x1440).WPF и SlimDX (DirectX 11) interop

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

_d3dImage.Lock(); // <- this call takes 78,5 % of the time when rendering the frame 
_d3dImage.AddDirtyRect(new Int32Rect(0, 0, _d3dImage.PixelWidth, _d3dImage.PixelHeight)); 
_d3dImage.Unlock(); 

Много времени тратится flusing устройство после нанесения:

_device.ImmediateContext.Flush(); // <- 20,6% of the time when rendering the frame 

Каждый знает проблему и как оптимизировать это? Можете ли вы ожидать получения снижения производительности при интеграции WPF и SlimDX?

+1

Блокировка блокирует нить до тех пор, пока нити пользовательского интерфейса не перестанут считывать задний буфер, а промывка довольно дорогая, поэтому эти результаты не являются необычными. Каковы ваши фактические показатели эффективности? Поддерживает ли ваш GPU вычисление шейдеров? Если нет, то это будет работать в программном обеспечении (то есть со скоростью запаха). –

+0

Похоже, проблема может иметь какое-то отношение к вычислительному шейдеру, используемому в образце GameOfLife. Если я отключу его, частота кадров вернется до 60 кадров в секунду ... – Pking

ответ

1

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

Я не уверен, что сказать вам в этот момент, за исключением того, что если это предположение верно, то окажется, что ваша карта не может справиться с нагрузкой.

+0

Спасибо, казалось бы, так. Хотя я работаю на Radeon HD5850, который должен обрабатывать нагрузку, которую я представляю, - шейдер не так уж сложный. – Pking

+1

Это определенно не все, что есть. У меня такая же проблема, когда Lock() берет навсегда, а размещение DirectX в Windows Forms приводит к значительно лучшей производительности. –

+0

Это интересно. Возможно, WPF + Dx не должен был быть. – Pking