Достижение максимальной производительности WPF 3D
При использовании Windows Presentation Foundation (WPF) для построения трехмерных элементов управления и включения трехмерных сцен в приложения необходимо рассмотреть вопрос оптимизации производительности. В этом разделе предоставляется список классов и свойств для трехмерных объектов, которые влияют на быстродействие приложения, а также рекомендации по оптимизации их производительности.
Этот раздел рассчитан на пользователей, профессионально использующих возможности 3D Windows Presentation Foundation (WPF). Предложения в этом документе справедливы для "отрисовки 2 уровня" — то есть для аппаратного обеспечения, которое поддерживает построитель текстуры версии 2.0 и вершинный построитель текстуры версии 2.0. Дополнительные сведения см. в разделе Уровни графической отрисовки.
Влияние на производительность: высокое
Свойство |
Рекомендации |
Скорость кисти (от самой быстрой к самой медленной): DrawingBrush (кэшированное) VisualBrush (кэшированное) DrawingBrush (некэшированное) VisualBrush (некэшированное) |
|
Устанавливайте Viewport3D.ClipToBounds в значение false, если Windows Presentation Foundation (WPF) не должен явным образом отсекать содержимое Viewport3D в прямоугольнике Viewport3D. Отсечение Windows Presentation Foundation (WPF) со сглаживанием может быть очень медленным, а по умолчанию ClipToBounds в Viewport3D включено (т. е. выполняется медленно). |
|
Устанавливайте для свойства Viewport3D.IsHitTestVisible значение false, если приложению Windows Presentation Foundation (WPF) не требуется учитывать содержимое элемента управления Viewport3D при выполнении проверки нажатия мыши. Проверка нажатия трехмерного содержимого выполняется программным образом, и для больших сеточных моделей она может быть достаточно продолжительной. Свойство IsHitTestVisible элемента управления Viewport3D по умолчанию включено (т.е. выполняется медленно). |
|
Создавайте различные модели только в том случае, если для них требуются различные материалы или преобразования. В противном случае попробуйте объединить несколько экземпляров GeometryModel3D с теми же материалами и преобразованиями в несколько больших экземпляров GeometryModel3D и MeshGeometry3D. |
|
Сеточная анимация (т. е. покадровое изменение отдельных вершин сетки) не всегда эффективна в Windows Presentation Foundation (WPF). Для уменьшения влияния уведомлений об изменении на производительность при изменении каждой вершины отсоедините сетку от визуального дерева перед тем, как выполнять преобразования каждой вершины. Завершив изменения сетки, снова присоедините ее к визуальному дереву. Также следует уменьшить размер сетки, которая будет анимирована подобным образом. |
|
3D-сглаживание |
Чтобы увеличить скорость отрисовки, отключите мультисэмплинг на Viewport3D, установив вложенное свойство EdgeMode в значение Aliased. По умолчанию, 3D сглаживание отключено в Microsoft Windows XP и включено в Windows Vista со значением в 4 сэмпла на каждую точку. |
Текст |
Отображение текста в реальном масштабе времени в 3D сцене может выполняться медленно (текст "в реальном масштабе времени", так как он содержится в DrawingBrush или VisualBrush). Попробуйте использовать изображения текста (с помощью RenderTargetBitmap), если текст не будет меняться. |
Если VisualBrush или DrawingBrush необходимо использовать в 3D сцене, поскольку содержимое кисти не статическое, попробуйте кэшировать кисть (с помощью установки вложенного свойства CachingHint в Cache). Задайте минимальное и максимальное пороговые значения недействительности масштаба с помощью вложенных свойств CacheInvalidationThresholdMinimum и CacheInvalidationThresholdMaximum. Это приведет к тому, что кэшированные кисти не будут обновляться слишком часто, но будут сохранять требуемый уровень качества. По умолчанию DrawingBrush и VisualBrush не кэшируются, то есть при повторном отображении нарисованного кистью все содержимое кисти необходимо еще раз построить в промежуточной области. |
|
BitmapEffect заставляет все измененное содержимое отображаться без аппаратного ускорения. Для лучшей производительности не следует использовать BitmapEffect. |
Влияние на производительность: среднее
Свойство |
Рекомендации |
Когда сетка определяется как граничащие треугольники с общими вершинами, и эти вершины имеют одну и ту же позицию, нормаль и координаты текстуры, определите каждую общую вершину только один раз, а затем определите треугольники по индексу с помощью TriangleIndices. |
|
Попробуйте уменьшить размеры текстуры при наличии явного управления размером (т.е.при использовании RenderTargetBitmap или ImageBrush). Обратите внимание, что текстуры более низкого разрешения могут снизить визуальное качество, поэтому следует найти правильный баланс между качеством и производительностью. |
|
Непрозрачность |
При отрисовке полупрозрачного 3D-содержимого (например отражений) используйте свойства непрозрачности на кистях или материалах (с помощью Opacity или Color) вместо того, чтобы создавать отдельные прозрачные Viewport3D путем установки Viewport3D.Opacity в значение меньше 1. |
Сократите число используемых в сцене объектов Viewport3D. Поместите несколько 3D моделей в один и тот же Viewport3D вместо создания отдельных экземпляров Viewport3D для каждой модели. |
|
Обычно это полезно для повторного использования MeshGeometry3D, GeometryModel3D, кистей и материалов. Все они могут иметь несколько родительских элементов, так как являются производными от Freezable. |
|
Вызовите метод Freeze на объектах Freezable, если их свойства в приложении не будут меняться. Замораживание может уменьшить рабочее множество и повысить скорость. |
|
Используйте ImageBrush вместо VisualBrush или DrawingBrush, если содержимое кисти не будет меняться. 2D-содержимое может быть преобразовано в Image с помощью RenderTargetBitmap и затем использовано в ImageBrush. |
|
Не используйте BackMaterial, если GeometryModel3D не требуется отображать с обратной стороны. |
|
Скорость света (от самой быстрой к самой медленной): |
|
Попробуйте сохранять размер сетки в следующих пределах: Positions: 20 001 экземпляр Point3D TriangleIndices: 60003 экземпляра Int32 |
|
Скорость материала (от самой быстрой до самой медленной): |
|
Трехмерная система Windows Presentation Foundation (WPF) не отказывается от невидимых кистей (черных кистей окружения, кистей очистки и т. д.) согласованным образом. Попробуйте отказаться от этих средств в сценах. |
|
Каждый Material в MaterialGroup вызывает следующий проход отрисовки. Таким образом, включение большого количества материалов, даже самых простых, может значительно увеличить загруженность графического процессора. Уменьшите количество материалов в MaterialGroup. |
Влияние на производительность: низкое
Свойство |
Рекомендации |
Когда анимация или привязка данных не требуется, используйте один MatrixTransform3D вместо преобразования группы, содержащей несколько преобразований. Для этого установите его таким образом, чтобы он был произведением всех преобразований, которые бы в противном случае существовали в группе преобразования независимо. |
|
Сократите число источников света в сценах. Слишком большое количество источников света в сцене заставит Windows Presentation Foundation (WPF) прибегнуть к программной визуализации. Максимально допустимо около 110 объектов DirectionalLight, 70 объектов PointLight или 40 объектов SpotLight. |
|
Отделяйте перемещаемые объекты от статических объектов, помещая их в отдельные экземпляры ModelVisual3D. ModelVisual3D "тяжелее" GeometryModel3D, так как он кэширует преобразованные границы. GeometryModel3D оптимизирован для использования в качестве модели, а ModelVisual3D оптимизирован для того, чтобы быть узлом сцены. Используйте ModelVisual3D для помещения в сцену общих экземпляров GeometryModel3D. |
|
Сократите изменения числа источников света в сцене. Каждое изменение числа источников света вызывает восстановление и повторную компиляцию построителя за исключением того случая, когда конфигурация существовала ранее и, таким образом, ее построитель уже кэширован. |
|
Свет |
Черные источники света не будут отображаться, но будут увеличивать время построения. Попробуйте по возможности отказаться от них. |
Для минимизации времени построения больших коллекций в Windows Presentation Foundation (WPF), таких как MeshGeometry3D Positions, Normals, TextureCoordinates и TriangleIndices, установите размер коллекции до заполнения значениями. По возможности передавайте конструкторам коллекции уже заполненные структуры данных, например массивы или списки. |