Достижение максимальной производительности WPF 3D

При использовании Windows Presentation Foundation (WPF) для создания трехмерных элементов управления и включения трехмерных сцен в приложения важно учитывать оптимизацию производительности. В этом разделе представлен список трехмерных классов и свойств, которые влияют на производительность приложения, а также рекомендации по оптимизации производительности при их использовании.

В этом разделе предполагается расширенное понимание функций Windows Presentation Foundation (WPF) 3D. Предложения в этом документе применяются к категории "отрисовка 2", примерно определяемой как оборудование, поддерживающее шейдер пикселей версии 2.0 и шейдер вершин версии 2.0. Дополнительные сведения см. в разделе "Уровни отрисовки графики".

Влияние на производительность: высокая

Свойство Рекомендация
Brush Скорость кисти (самая быстрая и медленная):

SolidColorBrush

LinearGradientBrush

ImageBrush

DrawingBrush (кэшировано)

VisualBrush (кэшировано)

RadialGradientBrush

DrawingBrush (некшированные)

VisualBrush (некшированные)
ClipToBoundsProperty Установите Viewport3D.ClipToBounds значение false всякий раз, когда не требуется явно закрепить содержимое Viewport3D прямоугольника Viewport3D в Windows Presentation Foundation (WPF). Антиалиасное вырезка Windows Presentation Foundation (WPF) может быть очень медленным и ClipToBounds включен (медленно) по умолчанию Viewport3D.
IsHitTestVisible Установите Viewport3D.IsHitTestVisible значение false всякий раз, когда не требуется Windows Presentation Foundation (WPF) для рассмотрения содержимого Viewport3D при тестировании нажатия мыши. Тестирование трехмерного содержимого выполняется в программном обеспечении и может быть медленным с большими сетками. IsHitTestVisible включен (медленно) по умолчанию Viewport3D.
GeometryModel3D Создавайте разные модели только в том случае, если им требуются различные материалы или преобразования. В противном случае попробуйте объединить множество GeometryModel3D экземпляров с теми же материалами и преобразованиями в несколько больших GeometryModel3D и MeshGeometry3D экземпляров.
MeshGeometry3D Анимация сетки ( изменение отдельных вершин сетки на основе кадра) не всегда эффективна в Windows Presentation Foundation (WPF). Чтобы свести к минимуму влияние на производительность уведомлений об изменениях при изменении каждой вершины, отсоедините сетку от визуального дерева перед выполнением изменения вершин. После изменения сетки повторно приклоните ее к визуальному дереву. Кроме того, попробуйте свести к минимуму размер сетки, которые будут анимированы таким образом.
Защита от 3D Чтобы увеличить скорость отрисовки, отключите многофакторную обработку, Viewport3D задав присоединенное свойство EdgeModeAliasedв значение . По умолчанию в Windows включена защита от 3D с 4 выборками на пиксель.
Текст Динамический текст в трехмерной сцене (живой, потому что он находится в или DrawingBrushVisualBrush) может быть медленным. Попробуйте использовать изображения текста (через RenderTargetBitmap), если текст не изменится.
TileBrush Если необходимо использовать или DrawingBrush в VisualBrush трехмерной сцене, так как содержимое кисти не является статическим, попробуйте кэширование кисти (присвойте присоединенному свойству CachingHint значениеCache). Задайте минимальные и максимальные пороговые значения недопустимой шкалы (с присоединенными свойствами CacheInvalidationThresholdMinimum и CacheInvalidationThresholdMaximum) так, чтобы кэшированные кисти не будут повторно создаваться слишком часто, сохраняя требуемый уровень качества. По умолчанию DrawingBrush и VisualBrush не кэшируются, то есть каждый раз при повторном отрисовки содержимого кисти необходимо повторно отрисовывать все содержимое кисти на промежуточной поверхности.
BitmapEffect BitmapEffect принудительно выполняет отрисовку всего затронутого содержимого без аппаратного ускорения. Для оптимальной производительности не используйте BitmapEffect.

Влияние на производительность: средний

Свойство Рекомендация
MeshGeometry3D Если сетка определяется как привязывание треугольников с общими вершинами и эти вершины имеют одинаковую позицию, обычные и текстурные координаты, определите каждую общую вершину только один раз, а затем определите треугольники по индексу.TriangleIndices
ImageBrush Попробуйте свести к минимуму размеры текстур, если у вас есть явный контроль над размером (при использовании RenderTargetBitmap и(или) ImageBrush). Обратите внимание, что текстуры с низким разрешением могут снизить качество визуализации, поэтому попробуйте найти правильный баланс между качеством и производительностью.
Непрозрачность При отрисовке полупрозрачного трехмерного содержимого (например, отражения) используйте свойства непрозрачности для кистей или материалов (через Opacity или Color) вместо создания отдельного полупрозрачного Viewport3D , задав Viewport3D.Opacity значение меньше 1.
Viewport3D Сведите к минимуму количество Viewport3D объектов, которые вы используете в сцене. Поместите много трехмерных моделей в один и тот же Viewport3D, а не создавайте отдельные экземпляры Viewport3D для каждой модели.
Freezable Как правило, полезно повторно использовать MeshGeometry3D, GeometryModel3Dкисти и материалы. Все являются многородными, так как они являются производными от Freezable.
Freezable Freeze Вызовите метод в Freezables, когда их свойства останутся неизменными в приложении. Замораживание может уменьшить рабочий набор и увеличить скорость.
Brush Используйте ImageBrush вместо VisualBrush него или DrawingBrush когда содержимое кисти не изменится. 2D-содержимое можно преобразовать в через ImageRenderTargetBitmap , а затем использовать в объекте ImageBrush.
BackMaterial Не используйте BackMaterial , если вы на самом деле не должны видеть задние лица вашего GeometryModel3D.
Light Скорость света (самая быстрая и медленная):

AmbientLight

DirectionalLight

PointLight

SpotLight
MeshGeometry3D Попробуйте сохранить размеры сетки под этими ограничениями:

Positions: 20 001 Point3D экземпляров

TriangleIndices: 60 003 Int32 экземпляров
Material Скорость материала (самая быстрая и медленная):

EmissiveMaterial

DiffuseMaterial

SpecularMaterial
Brush Windows Presentation Foundation (WPF) 3D не отключает невидимые кисти (черные кисти окружающей среды, очистка кистей и т. д.) согласованно. Попробуйте опустить их из сцены.
MaterialGroup Каждый Material из MaterialGroup них вызывает другой проход отрисовки, так что в том числе многие материалы, даже простые материалы, могут значительно увеличить спрос на заполнение на gpu. Свести к минимуму количество материалов в вашем MaterialGroup.

Влияние на производительность: низкая

Свойство Рекомендация
Transform3DGroup Если не требуется анимация или привязка данных, вместо использования группы преобразований, содержащей несколько преобразований, используйте один MatrixTransform3Dпараметр, задав его как продукт всех преобразований, которые в противном случае существуют независимо в группе преобразований.
Light Сведите к минимуму количество света в сцене. Слишком много света в сцене заставит Windows Presentation Foundation (WPF) вернуться к программной отрисовке. Ограничения — примерно 110 DirectionalLight объектов, 70 PointLight объектов или 40 SpotLight объектов.
ModelVisual3D Отделяйте перемещаемые объекты от статических объектов, помещая их в отдельные ModelVisual3D экземпляры. ModelVisual3D является "тяжелее", чем GeometryModel3D потому, что кэширует преобразованные границы. GeometryModel3D оптимизирован для модели; ModelVisual3D оптимизирован для создания узла сцены. Используйте ModelVisual3D, чтобы поместить общие экземпляры GeometryModel3D в сцену.
Light Сведите к минимуму количество раз, когда вы изменяете количество огней в сцене. Каждое изменение света заставляет повторное создание шейдера и перекомпиляцию, если эта конфигурация ранее не существовала (и, следовательно, кэширована его шейдером).
Светлая Черные огни не будут видимыми, но они будут добавляться во время отрисовки; рассмотрите возможность опустить их.
MeshGeometry3D Чтобы свести к минимуму время сборки больших коллекций в Windows Presentation Foundation (WPF), например сетку MeshGeometry3D Positions, NormalsTextureCoordinatesи TriangleIndicesпредварительно размер коллекций перед заполнением значений. По возможности передайте конструкторы коллекций, предварительно заполненные структуры данных, такие как массивы или списки.

См. также