Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
WPF предоставляет широкий спектр функциональных возможностей трехмерной графики и изображений, которые можно оптимизировать для требований приложения. В этом разделе содержатся сведения об оптимизации производительности в этих областях.
Рисование и фигуры
WPF предоставляет как Drawing, так и Shape объекты для представления графического содержимого. Однако Drawing объекты являются более простыми конструкциями, чем Shape объектами и обеспечивают более высокую производительность.
Shape позволяет нарисовать графическую фигуру на экране. Так как они являются производными от класса FrameworkElement, Shape объекты можно использовать внутри панелей и большинства элементов управления.
WPF предлагает несколько уровней доступа к службам графики и отрисовки. На верхнем уровне объекты Shape легко использовать и предоставляют множество полезных функций, таких как макет и обработка событий. WPF предоставляет ряд готовых объектов фигур. Все объекты фигуры унаследованы от класса Shape. Доступные объекты фигур включают Ellipse, Line, Path, Polygon, Polylineи Rectangle.
Drawing объекты, с другой стороны, не являются производными от класса FrameworkElement и предоставляют более легкую реализацию для отрисовки фигур, изображений и текста.
Существует четыре типа объектов Drawing:
GeometryDrawing рисует фигуру.
ImageDrawing рисует изображение.
GlyphRunDrawing рисует текст.
DrawingGroup рисует другие рисунки. Используйте группу рисования для объединения других рисунков в один составной рисунок.
Объект GeometryDrawing используется для отображения геометрического содержимого. Класс Geometry и конкретные классы, производные от него, такие как CombinedGeometry, EllipseGeometryи PathGeometry, обеспечивают возможность отрисовки 2D-графики и поддержку проверки попадания и отсечения. Геометрические объекты можно использовать для определения региона элемента управления или, например, области обрезки, применяемой к изображению. Геометрические объекты могут быть простыми областями, такими как прямоугольники и круги, или составные области, созданные из двух или нескольких геометрических объектов. Более сложные геометрические области можно создать путем объединения производных PathSegmentобъектов, таких как ArcSegment, BezierSegmentи QuadraticBezierSegment.
На поверхности класс Geometry и класс Shape похожи. Оба используются в отрисовке 2D-графики и имеют аналогичные конкретные классы, производные от них, например, EllipseGeometry и Ellipse. Однако существуют важные различия между этими двумя наборами классов. Например, класс Geometry не имеет некоторых функций класса Shape, таких как возможность рисовать себя. Чтобы нарисовать геометрический объект, для выполнения операции рисования необходимо использовать другой класс, например DrawingContext, Drawing или Path (следует отметить, что путь является фигурой). Свойства отрисовки, такие как заливка, штрих и толщина штриха, находятся в классе, который рисует геометрический объект, а объект фигуры содержит эти свойства. Один из способов осмыслить это различие заключается в том, что геометрический объект определяет регион, например, круг, а объект фигуры определяет, как этот регион заполняется и очерчивается, а также участвует в системе компоновки.
Так как объекты Shape являются производными от класса FrameworkElement, их использование может значительно увеличить потребление памяти в вашем приложении. Если вам действительно не нужны функции FrameworkElement для вашей графики, рассмотрите использование более легких объектов Drawing.
Дополнительные сведения об объектах Drawing см. в обзоре объектов для рисования .
Объекты StreamGeometry
Объект StreamGeometry является упрощенной альтернативой PathGeometry для создания геометрических фигур. Используйте StreamGeometry, когда необходимо описать сложную геометрию. StreamGeometry оптимизирован для обработки многих объектов PathGeometry и лучше работает по сравнению с использованием множества отдельных объектов PathGeometry.
В следующем примере используется синтаксис атрибутов для создания треугольника StreamGeometry в XAML.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel>
<Path Data="F0 M10,100 L100,100 100,50Z"
StrokeThickness="1" Stroke="Black"/>
</StackPanel>
</Page>
Дополнительные сведения о объектах StreamGeometry см. в статье Создание фигуры с помощьюStreamGeometry.
Объекты типа DrawingVisual
Объект DrawingVisual — это упрощенный класс рисования, используемый для отрисовки фигур, изображений или текста. Этот класс считается упрощенным, так как он не предоставляет разметку или обработку событий, что повышает его производительность. По этой причине рисунки идеально подходят для фона и картинок. Дополнительные сведения см. в разделе Использование объектов DrawingVisual.
Изображения
Визуализация WPF обеспечивает значительное улучшение возможностей визуализации в предыдущих версиях Windows. Возможности визуализации, такие как отображение растрового изображения или использование изображения на общем элементе управления, в основном обрабатываются интерфейсом графических устройств Microsoft Windows (GDI) или интерфейсом программирования приложений Microsoft Windows GDI+ (API). Эти API предоставляют базовые функциональные возможности визуализации, но не хватает таких функций, как поддержка расширяемости кодека и поддержки изображений высокой точности. API-интерфейсы визуализации WPF были изменены, чтобы преодолеть недостатки GDI и GDI+ и предоставить новый набор API для отображения и использования изображений в приложениях.
При использовании изображений рассмотрите следующие рекомендации по повышению производительности:
Если приложению требуется отобразить изображения эскизов, попробуйте создать уменьшенную версию изображения. По умолчанию WPF загружает образ и декодирует его в полный размер. Если вам нужна только уменьшенная версия изображения, WPF ненужно декодирует изображение до полного размера, а затем уменьшает его до размера эскиза. Чтобы избежать этой ненужной нагрузки, можно запросить WPF для декодирования изображения в размер эскиза или запросить WPF для загрузки изображения размера эскиза.
Всегда декодировать изображение до нужного размера, а не до размера по умолчанию. Как упоминалось выше, попросите WPF декодировать изображение в нужный размер, а не полный размер по умолчанию. Вы также уменьшите не только рабочий набор приложения, но и скорость выполнения.
По возможности объедините изображения в один образ, например полосу пленки, состоящую из нескольких изображений.
Дополнительные сведения см. в разделе Обзор визуализации.
Режим Масштабирования Битмапа
При анимации масштаба любого растрового изображения высококачественный алгоритм ресемплинга изображений по умолчанию иногда может использовать достаточно системных ресурсов, чтобы привести к снижению частоты кадров, эффективно заставляя анимацию заикаться. Задав свойство BitmapScalingMode объекта RenderOptions на LowQuality, можно создать более плавное анимацию при масштабировании растрового изображения. LowQuality режим сообщает обработчику отрисовки WPF переключиться с оптимизированного для качества алгоритма на алгоритм, оптимизированный для скорости при обработке изображений.
В следующем примере показано, как задать BitmapScalingMode для объекта изображения.
// Set the bitmap scaling mode for the image to render faster.
RenderOptions.SetBitmapScalingMode(MyImage, BitmapScalingMode.LowQuality);
' Set the bitmap scaling mode for the image to render faster.
RenderOptions.SetBitmapScalingMode(MyImage, BitmapScalingMode.LowQuality)
КэшированиеHint
По умолчанию WPF не кэширует отрисованное содержимое объектов TileBrush, таких как DrawingBrush и VisualBrush. В статических сценариях, когда содержимое или использование TileBrush в сцене не меняется, это имеет смысл, так как сохраняется видеопамять. Это теряет смысл, если TileBrush со статическим содержимым используется нестатическим способом, например, когда статический DrawingBrush или VisualBrush сопоставляется с поверхностью вращающегося трехмерного объекта. Поведение WPF по умолчанию заключается в повторной отрисовки всего содержимого DrawingBrush или VisualBrush для каждого кадра, даже если содержимое не изменяется.
Присваивая свойству CachingHint объекта RenderOptions значение Cache, вы можете повысить производительность, используя кэшированные версии объектов плиточной кисти.
Значения свойств CacheInvalidationThresholdMinimum и CacheInvalidationThresholdMaximum — это относительные значения размера, определяющие, когда объект TileBrush должен быть воссоздан вследствие изменений масштаба. Например, при задании свойства CacheInvalidationThresholdMaximum значение 2.0 кэш для TileBrush необходимо повторно создать, только если его размер превышает два раза больше текущего кэша.
В следующем примере показано, как использовать параметр указания кэширования для DrawingBrush.
DrawingBrush drawingBrush = new DrawingBrush();
// Set the caching hint option for the brush.
RenderOptions.SetCachingHint(drawingBrush, CachingHint.Cache);
// Set the minimum and maximum relative sizes for regenerating the tiled brush.
// The tiled brush will be regenerated and re-cached when its size is
// 0.5x or 2x of the current cached size.
RenderOptions.SetCacheInvalidationThresholdMinimum(drawingBrush, 0.5);
RenderOptions.SetCacheInvalidationThresholdMaximum(drawingBrush, 2.0);
Dim drawingBrush As New DrawingBrush()
' Set the caching hint option for the brush.
RenderOptions.SetCachingHint(drawingBrush, CachingHint.Cache)
' Set the minimum and maximum relative sizes for regenerating the tiled brush.
' The tiled brush will be regenerated and re-cached when its size is
' 0.5x or 2x of the current cached size.
RenderOptions.SetCacheInvalidationThresholdMinimum(drawingBrush, 0.5)
RenderOptions.SetCacheInvalidationThresholdMaximum(drawingBrush, 2.0)
См. также
.NET Desktop feedback