WPF 3-D производительность для приложения отслеживания головы - PullRequest
3 голосов
/ 01 сентября 2009

Я работаю над созданием полноэкранного трехмерного приложения (на основе приложения для отслеживания головы Wi-Fi Джонни Ли ) с некоторыми функциями дополненной реальности, и кажется, что WPF слишком медленный, чтобы рендерить даже простые модели, которые я использую с разумной частотой кадров. Я думаю, что проблема в том, что мне нужно менять вид и проекцию камеры практически на каждом кадре из-за характера приложения (оно использует веб-камеру для отслеживания вашего лица и использует эти данные для перемещения камеры). вокруг и изменить свою перспективу).

Я потратил много времени, пытаясь сузить проблему, и она определенно связана с графикой, а не со скоростью используемого API отслеживания головы. Кроме того, я воссоздал приложение в XNA, и, похоже, там оно работает нормально (28 FPS против 9 в WPF). Наконец, когда я удаляю «стены» или делаю окно намного меньше (скажем, 800 x 600), производительность WPF значительно улучшается, что заставляет меня думать, что узким местом являются графические вычисления.

В результате мне нужно либо найти новый графический интерфейс для работы, либо найти способ сделать WPF намного быстрее для этого приложения. Я в основном смотрю на DirectX и XNA и, возможно, на OpenGL. Любые рекомендации, какие из этих API лучше всего использовать для этого приложения в .NET? Или, альтернативно, есть идеи, что я делаю неправильно в WPF, что замедляет работу?

Ответы [ 3 ]

2 голосов
/ 01 сентября 2009

Я недостаточно сделал с 3D в WPF, чтобы сказать, что может быть причиной медлительности, но я заметил, что структура модели данных не очень эффективна. Хотя это может и не быть причиной, это может быть симптомом общей медлительности всего конвейера.

Одна вещь, которая приходит на ум, это то, что WPF рендерит сцену программно, а не использует аппаратное ускорение на видеокарте. Тот факт, что вы получаете лучшую производительность (хотя вы не говорите, насколько лучше) с меньшим окном.

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

Я не думаю, что действительно важно, используете ли вы Direct3D или OpenGL - практически все современные карты поддерживают их одинаково хорошо. XNA - очевидный выбор, если вы придерживаетесь .NET, поскольку он интегрирован в Visual Studio - даже в редакцию Express.

1 голос
/ 01 сентября 2009

Я бы посмотрел SlimDX , гораздо более тонкую оболочку DirectX, чем XNA или WPF

Проблема с изменением проекции в каждом кадре состоит в том, что API, подобные XNA / WPF, не были спроектированы с учетом этого, поэтому были оптимизированы для установки проекции один раз на этапе инициализации, а не снова.

0 голосов
/ 02 сентября 2009

Я бы предложил здесь гибридный выбор: использовать WPF для своих целей (Windows UI, композиция и т. Д.) И использовать XNA для рендеринга 3D. Есть выборок , которые демонстрируют объединение XNA с WinForms. Должна быть возможность сделать тот же «трюк» для визуализации XNA на поверхностях в WPF.

Обновление: есть предположительно проблемы с использованием XNA напрямую с WPF. Этот поток указывает, что использование XNA с WinForms и последующее размещение элемента управления WinForms в WPF - это обходной путь для этих проблем. Я еще не проверял это сам (пока).

...