Достижение максимальной производительности 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предварительно размер коллекций перед заполнением значений. По возможности передайте конструкторы коллекций, предварительно заполненные структуры данных, такие как массивы или списки. |
См. также
.NET Desktop feedback
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по