Визуализация WPF DrawingGroup в один ImageSource - PullRequest
3 голосов
/ 28 августа 2009

В настоящее время я использую System.Windows.Media.DrawingGroup для хранения некоторых мозаичных изображений (ImageDrawing) внутри свойства Children-DrawingCollection. Теперь проблема в том, что этот метод становится очень медленным, если вы отображаете всю DrawingGroup в элементе управления Image, потому что моя DrawingGroup может содержать сотни или даже тысячи маленьких изображений, которые могут реально испортить производительность.

Итак, моей первой мыслью было как-то визуализировать одно изображение из всех маленьких внутри DrawingGroup, а затем только отображать это изображение, что было бы намного быстрее. Но, как вы могли догадаться, я не нашел никакого решения, поэтому просто объедините несколько изображений с WPF Imaging.

Было бы здорово, если бы кто-то мог помочь с этой проблемой или сказать мне, как я могу улучшить производительность с помощью DrawingGroup или даже использовать другой подход.

И последнее: в настоящее время я использую RenderTargetBitmap для генерации одного BitmapSource из DrawingGroup, этот подход не очень быстрый, но он делает прокрутку и работу с элементом управления Image как минимум немного более плавными. *

Ответы [ 2 ]

2 голосов
/ 01 июня 2010

Я не уверен, что это относится к вашей проблеме, но я все равно опубликую это здесь, так как это может кому-то помочь:

Если не все изображения в группе рисунков будут видны одновременно, вы можете установить для свойства ClipGeometry значение, которое вы хотите нарисовать. Это эффективно говорит WPF, что части вне геометрии не нужны и будут пропущены во время рендеринга.

Несколько других вещей, с которыми вы могли бы поэкспериментировать:

  • Заморозьте группу чертежей перед ее применением к источнику изображения. По крайней мере, это не повредит (если только вам действительно не нужно изменять экземпляр, но помните, что вы всегда можете просто создать новый вместо изменения старого)
  • Попробуйте разные способы отображения вашей группы для рисования. Например, как DrawingVisual (который считается легким) или как DrawingBrush для рисования, например. прямоугольник.
  • Объедините маленькие изображения в меньшие группы, которые затем объедините в большую группу. Не знаю, улучшит ли это производительность или повредит ли она, но стоит попробовать.
1 голос
/ 01 сентября 2009

Я работаю над проблемой, связанной с мозаичными изображениями, с дополнительным усложнением необходимости отображения некоторых изображений, наложенных на другие.

Я не сталкивался с какими-либо проблемами с производительностью (и, скорее всего, не буду, так как мои изображения довольно маленькие и относительно малы по количеству, около 100 макс.), Но я встретил метод Freeze в примере кода Класс DrawingImage. Комментарий для этого был «Заморозить DrawingImage для повышения производительности.»

Метод Freeze также применяется к классу DrawingGroup. Может быть, попробовать?

...