Оптимизация производительности: Двумерная графика и изображения
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, предоставляют средства для отрисовки двумерной графики, а также предоставляет возможности попадания и поддержки обрезки. Геометрические объекты можно использовать, например, для определения области элемента управления или для определения области усечения, применяемой к изображению. Геометрические объекты могут быть простыми, такими как прямоугольники и круги, или сложными, созданными из двух или более геометрических объектов. Более сложные геометрические области можно создать путем объединения PathSegment-производных объектов, таких как ArcSegment, BezierSegment, и QuadraticBezierSegment.
В рабочей области Geometry класс и Shape класс весьма похожи. Оба используются в рендеринге двумерной графики и оба имеют аналогичные конкретные классы, которые являются производными от них, например, EllipseGeometry и Ellipse. Однако существуют важные различия между этими двумя наборами классов. Например Geometry класса отсутствуют некоторые функциональные возможности Shape класса, такие как возможность рисования самого себя. Чтобы нарисовать геометрический объект, для выполнения операции рисования должен использоваться другой класс, например DrawingContext, Drawing или Path (стоит отметить, что Path является Shape). Свойства рендеринга, такие как заливка (fill), штрих (stroke) и толщина штриха (stroke thickness), находятся в классе, который рисует этот геометрический объект, в то время как объект Shape содержит эти свойства. Чтобы понять это различие, представьте, что геометрический объект определяет область, например круг, а объект Shape определяет область, определяет, как эта область заполняется и обводится, а также участвует в системе макета.
Так как Shape объекты являются производными от FrameworkElement класса, с их помощью можно добавить значительно увеличить потребление памяти в приложении. Если вам действительно не нужен FrameworkElement функции для вашего графического контента, рассмотрите возможность использования упрощенных Drawing объектов.
Дополнительные сведения о 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. Возможности обработки изображений, например вывод растрового изображения или использование изображения в общем элементе управления, в основном управлялись интерфейсом графических устройств (GDI) Microsoft Windows или Microsoft Windows GDI и программным интерфейсом (API). Эти API обеспечивали базовые функции обработки изображений, но в них отсутствовали такие возможности, как поддержка расширяемости кодеков и изображений высокого качества. API обработки изображений WPF был переработан для преодоления недостатков GDI и GDI+ и теперь предоставляет новый набор API для отображения и использования изображений в приложениях.
При использовании изображений учитывайте следующие рекомендации, позволяющие повысить производительность.
Если в приложении требуется отображение эскизов, рассмотрите возможность создания версий изображений уменьшенного размера. По умолчанию WPF загружает изображение и преобразует его до полного размера. Если требуется только эскиз изображения, WPF напрасно преобразует изображение до полного размера, а затем масштабирует его до размера эскиза. Чтобы избежать этой лишней нагрузки, можно либо запросить в WPF преобразование изображения в размер эскиза, либо настроить WPF для загрузки изображения размера эскиза.
Всегда преобразуйте изображение в нужный размер, а не размер по умолчанию. Как упоминалось выше, запросите в WPF преобразование изображения в нужный размер, а не в полный размер по умолчанию. Вы уменьшите не только рабочий набор приложения, но также и время ожидания выполнения.
Если это возможно, объединяйте изображения в одно изображение, например диафильм, состоящий из нескольких изображений.
Более подробную информацию см. в разделе Общие сведения об обработке изображений.
BitmapScalingMode
При анимации масштабирования любого растрового изображения алгоритм повторной дискретизации изображения высокого качества по умолчанию иногда может использовать столько системных ресурсов, чтобы привести к снижению частоты кадров анимации и задержкам. Установив BitmapScalingMode свойство RenderOptions объект LowQuality можно создавать более плавную анимацию при масштабировании растрового изображения. LowQuality Указывает режим WPF механизм визуализации для переключения с помощью алгоритма, оптимизированного по качеству алгоритм, оптимизированный по скорости, при обработке изображений.
В следующем примере показано, как задать BitmapScalingMode для объекта изображения.
// Set the bitmap scaling mode for the image to render faster.
RenderOptions.SetBitmapScalingMode(MyImage, BitmapScalingMode.LowQuality);
CachingHint
По умолчанию 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);
См. также
- Улучшение производительности приложений WPF
- Планирование производительности приложения
- Использование преимуществ оборудования
- Разметка и разработка
- Поведение объекта
- Ресурсы приложений
- Текста
- Привязка данных
- Дополнительные рекомендации по повышению производительности
- Советы и рекомендации по анимации