Какой из них имеет более высокую производительность во время выполнения: WPF или Winforms? - PullRequest
14 голосов
/ 26 марта 2010

Я знаю, что WPF более сложный и гибкий, поэтому можно подумать, что он будет делать больше вычислений. Но поскольку рендеринг выполняется на графическом процессоре, не будет ли он быстрее, чем Winforms для того же приложения (функционально и визуально)?

Я имею в виду, что когда у вас нет игр или тяжелого рендеринга, графический процессор не выполняет тяжелую работу, верно? В то время как процессор всегда занят.

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

РЕДАКТИРОВАТЬ: меня интересует приложение для 3D-моделирования и анимации, где у вас есть 3D-окна для навигации и редактирования сцены и объектов внутри сцены. Но я хочу использовать WPF из-за его современной архитектуры, и это с нуля.

EDIT2: Я также буду использовать DirectX для самого приложения из-за высоких требований к программному обеспечению. Что касается людей, использующих низкоуровневые компьютеры или компьютеры без выделенного графического процессора, то это нормально, поскольку их нет в моей основной клиентской зоне. Точно так же, как и другие высококачественные 3D-программы для фильмов и игр, будет понятно, что для полноценного использования приложения необходим мощный компьютер.

Ответы [ 5 ]

18 голосов
/ 26 марта 2010

Если на компьютере установлен графический процессор, вы получите лучшую производительность рендеринга в WPF.

У нас есть большое настольное приложение, которое мы написали в WinForms и теперь портируем на WPF. Мы стали свидетелями гораздо лучшей производительности рендеринга, особенно при изменении размеров окон или перерисовке элементов управления.

Мы также обнаружили, что элементы управления WPF более легкие, чем элементы управления WinForm. Если я правильно помню, элементам управления WPF не обязательно требуется дескриптор операционной системы, и они не регистрируются в сообщениях окон Windows через WndProc, по крайней мере, независимо.

В вашем случае, поскольку вы создаете приложение для 3d-моделирования, которое предполагает использование некоторого оборудования на компьютере, вы должны использовать WPF поверх WinForms.

7 голосов
/ 26 марта 2010

Для сценария приложения, который вы описываете, я ожидаю, что WPF превзойдет WinForms для работы с 3D на полнофункциональном графическом процессоре с большим отрывом.

Разница между типами приложений заключается не только в рендеринге трехмерного векторного конвейера. Внутренняя архитектура WPF радикально отличается от WinForms, специально разработанной для преодоления недостатков, извлеченных из многолетнего опыта работы с приложениями Windows GDI и WinForms.

(WinForms - это относительно тонкая оболочка для модели Windows GDI и User, которая была изначально создана в конце 1980-х годов. Модель управления пользователями Windows развивалась в течение последних 25 лет, но основные архитектурные шаблоны в основном не изменились.)

Например, WPF всегда отделяет рендеринг пользовательского интерфейса от логики приложения. Когда окно WPF начинает рисовать что-то, фактический рендеринг происходит в фоновом потоке. Обновленные изображения переворачиваются на дисплей во время интервала восстановления видео, поэтому на экране не появляются частичные блики или «разрывающиеся» артефакты.

WinForms не делает ничего из этого. Если вы выполняете рендеринг на поверхности DirectX или OpenGL в приложении WinForms, вы должны выполнить перелистывание страницы видео и убедиться, что это происходит в нужное время, чтобы избежать появления разрывов экрана.

Стандартные элементы управления Wpf поддерживают GPU и могут быть выполнены в индивидуальном стиле с блеском и прозрачностью, а также ускорением всех графических процессоров. Элементы управления WinForms не получают существенных преимуществ от функций графического процессора, поскольку единственное, что WinForms (элементы управления Windows) использует для рендеринга, это 2D-битблит и заливка прямоугольника. Свечение, прозрачность, анимация возможны с WinForms, но вы должны сделать все работу, чтобы их реализовать.

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

6 голосов
/ 26 марта 2010

Это действительно сложный вопрос.

Огромная часть производительности WPF - это ваш графический процессор. Хороший графический процессор творит чудеса, чтобы заставить WPF работать хорошо. WPF может быть очень производительным. Если ваши требования состоят в том, чтобы иметь достойный графический процессор, поскольку это программа 3D-моделирования, вы, вероятно, найдете производительность WPF такой же или лучше, чем у Windows Forms - хотя это действительно зависит от того, что вы используете.

При этом, как правило, трудно сравнивать - в основном потому, что WPF позволяет добавлять множество визуальных эффектов, которые люди даже не используют в Windows Forms. Многие приложения WPF «кажутся» быстрее, хотя в некоторых случаях они на самом деле медленнее из-за дополнительных визуальных подсказок.

При этом, если у вас есть МНОГО элементов управления, WPF может на самом деле превзойти Windows Forms на значительную сумму. В Windows Forms каждый элемент управления требует отдельного дескриптора окна и получает свои собственные наборы сообщений. Благодаря большому количеству элементов управления это может значительно замедлить процесс.

Настоящий вопрос здесь должен быть - WPF perf. «достаточно хорошо» для вашего приложения. Если вы работаете в приложении для 3D-моделирования, скорее всего, WPF не станет для вас узким местом - все должно быть в порядке.

2 голосов
/ 26 марта 2010

Для 3D-моделирования WPF, безусловно, намного лучший выбор, чем WinForms, но он все еще далек от идеального. Winforms вообще не имеет (прямой) поддержки 3D-рендеринга, а в WPF есть. Однако для программы, ориентированной в первую очередь на 3D-рендеринг, вам может быть выгоднее использовать что-то, специально предназначенное для задач 3D-рендеринга, например OpenGL или Direct3D.

Сами по себе, ни один из них не дает огромного преимущества перед WPF, но если бы то, что вы делаете, не было достаточно специализированным, я бы не стал использовать их напрямую. Я бы использовал что-то вроде OpenSceneGraph или Ogre3D , которое может использовать любой из них для своего рендеринга, но предоставляет интерфейс более высокого уровня и делает больше для управления рендерингом вашей сцены.

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

1 голос
/ 26 марта 2010

Поскольку WPF фактически использует DirectX под капотом и тот факт, что вы используете XAML для указания объектов DirectX, WPF - безусловно, самое простое решение.

Пример кодирования камеры в xaml :

<PerspectiveCamera x:Key="Camera"
 Position="0, 0, 4"
 LookDirection="0, 0, -4"
 UpDirection="0, 1, 0"
 FieldOfView="30"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...