Достижение максимальной производительности WPF 3D
При использовании Windows Presentation Foundation (WPF) для создания трехмерных элементов управления и включения трехмерных сцен в приложениях, важно рассмотреть вопрос оптимизации производительности. Здесь представлен список 3D классов и свойств, которые влияют на производительность приложения, а также рекомендации по оптимизации производительности при их использовании.
В этом разделе предполагается, что хорошо знакомы с Windows Presentation Foundation (WPF) трехмерные функции. В этом документе приводятся советы для «уровень отрисовки 2» — примерно определяется как оборудование, поддерживающее версия построителя текстуры 2.0 и вершинный построитель текстуры версии 2.0. Дополнительные сведения см. в разделе уровни отрисовки графики.
Влияние на производительность: High
Свойство | Рекомендация |
---|---|
Brush | Скорость кисти (от самой быстрой к самой медленной): SolidColorBrush LinearGradientBrush ImageBrush DrawingBrush (с кэшированием) VisualBrush (с кэшированием) RadialGradientBrush DrawingBrush (без кэширования). VisualBrush (без кэширования). |
ClipToBoundsProperty | Задайте Viewport3D.ClipToBounds значение false, если вы не обязательно должны иметь Windows Presentation Foundation (WPF) явно усечение содержимого Viewport3D прямоугольник Viewport3D. 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 , установив присоединенное свойство EdgeMode для Aliased . По умолчанию, 3D сглаживание отключено на Microsoft Windows XP и включены на Windows Vista с 4 образцами на пиксель. |
Текста | Live текст в трехмерной сцене (live, так как он DrawingBrush или VisualBrush) может выполняться медленно. Попробуйте вместо этого использовать изображения текста (с помощью RenderTargetBitmap) Если не приведет к изменению текста. |
TileBrush | Если необходимо использовать VisualBrush или DrawingBrush в трехмерной сцене, так как содержимое кисти не является статическим, попробуйте, кэшировать кисть (установив это присоединенное свойство CachingHint для Cache ). Пороги недействительности минимальный и максимальный масштаб (с помощью вложенных свойств CacheInvalidationThresholdMinimum и CacheInvalidationThresholdMaximum), чтобы кэшируемых кистей не будет повторно создать слишком часто, сохраняя при этом нужный уровень качества. По умолчанию DrawingBrush и VisualBrush не кэшируются, это означает, что каждый раз, когда что-то закрашивается с кисть, которая должна быть повторно подготовленных к просмотру, все содержимое кисти сначала должен быть заново отрисовать промежуточных область. |
BitmapEffect | BitmapEffect заставляет все измененное содержимое будет отображаться без аппаратного ускорения. Для наилучшей производительности, не используйте BitmapEffect. |
Влияние на производительность: Средняя
Свойство | Рекомендация |
---|---|
MeshGeometry3D | Когда сетки определяется как соседними треугольники с общими вершинами, и эти вершины имеют те же позиции, обычный и координаты текстуры, определите каждую общую вершину только один раз, а затем определите треугольники по индексу с TriangleIndices. |
ImageBrush | Попробуйте уменьшить размеры текстуры при наличии явного управления размер (при использовании RenderTargetBitmap и/или ImageBrush). Обратите внимание, что текстуры более низкого разрешения могут снизить качество изображения, поэтому следует найти правильный баланс между качеством и производительностью. |
Непрозрачность | При отрисовке прозрачные трехмерного содержимого (например отражений), используйте свойства непрозрачности кисти или материалов (с помощью Opacity или Color) вместо создания отдельного прозрачные Viewport3D , задав Viewport3D.Opacity значение меньше 1. |
Viewport3D | Свести к минимуму количество Viewport3D объектов, вы используете в сцене. Поместите несколько 3D моделей в тот же Viewport3D, а не создавать отдельные экземпляры Viewport3D для каждой модели. |
Freezable | Обычно это полезно для повторного использования MeshGeometry3D, GeometryModel3D, кистей и материалов. Все являются multiparentable, так как они являются производными от Freezable . |
Freezable | Вызовите Freeze метод на объектах Freezable, если их свойства останется без изменений в приложении. Замораживание можно уменьшить рабочего набора, а также повысить скорость. |
Brush | Используйте ImageBrush вместо VisualBrush или DrawingBrush при содержимое кисти не изменится. 2D-содержимого могут преобразовываться в Image через RenderTargetBitmap , а затем использовать в 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) Объемные эффекты не отказывается от невидимых кистей (черных кистей окружения, кистей очистки и т.д.) согласованным образом. Рассмотрите возможность отказаться от сцены этих средств. |
MaterialGroup | Каждый Material в MaterialGroup вызывает передачу другого отрисовки, таким образом, включая множество материалов, даже простое материалам, может существенно увеличить нагрузку заливки на установленный GPU. Свести к минимуму количество материалов в вашей MaterialGroup. |
Влияние на производительность: Low
Свойство | Рекомендация |
---|---|
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, Normals, TextureCoordinates, и TriangleIndices, предварительно размер коллекции, перед заполнением значение. Если это возможно передайте коллекции конструкторов предварительно заполненных такие структуры данных, массивов или списков. |