Рендеринг многих элементов в DrawingVisual - PullRequest
2 голосов
/ 28 февраля 2012

У меня есть некоторые проблемы с производительностью в моем коде ... Мне нужно визуализировать разноцветные прямоугольники в DrawingVisual.

Первая версия проста:

using (DrawingContext dc = Canvas.RenderOpen())
{
   for (Int32 x = 0; x < widthCount; x++)
      for (Int32 y = 0; y < heightCount; y++)
      {
          Color c;
          Double value = mass[x, y];
          c = GetColorByValue(value);
          dc.DrawRectangle(new SolidColorBrush(c), null,
          new Rect(x * step - step / 2, y * step - step / 2, step, step));
       }
}

И работает нормально, если количество прямоугольников составляет около 250х250 (и получает 200 МБ ОЗУ). Но если их число составляет 750x750, процесс рендеринга будет слишком длинным и медленным (получает более 2,5 ГБ ОЗУ)

Следующим шагом было использование растрового изображения, такого как буфер. Но есть проблема с размером моего DrawingVisual. Визуальный действительно большой. Поэтому невозможно создать полноразмерное растровое изображение, потому что конструктор RenderTargetBitmap выдает исключение «Данные изображения вызвали переполнение во время обработки».

Наконец я создал небольшое растровое изображение и растянул его до своего визуального объекта. Однако проблема та же (она работает слишком медленно и получает много оперативной памяти).

Что я должен сделать, чтобы процесс рендеринга элементов получил достаточное время и источники?

Привет!

Спасибо!

1 Ответ

2 голосов
/ 19 марта 2012

Да!Я нашел способ решить эту проблему!Впервые я неправильно использовал растровое изображение в качестве буфера.Но теперь я использую это правильно.Мой код:

//temp visual
DrawingVisual tmpVisual = new DrawingVisual();
using (DrawingContext dc = tmpVisual.RenderOpen())
{
     for (Int32 x = 0; x < widthCount; x++)
          for (Int32 y = 0; y < heightCount; y++)
          {
              Color c;
              Double value = mass[x, y];
              c = GetColorByValue(value);
              dc.DrawRectangle(new SolidColorBrush(c), null,
                  new Rect(x * step - step / 2, y * step - step / 2, step, step));
          }
}

//resize visual
tmpVisual.Transform = new ScaleTransform(maxWidth/(widthCount * step),
                        maxHeight/(heightCount * step));

//visual to bitmap
RenderTargetBitmap bitmap = 
    new RenderTargetBitmap(maxWidth, maxHeight, 96, 96, PixelFormats.Pbgra32);
bitmap.Render(tmpVisual);

using (DrawingContext dc = Canvas.RenderOpen())
{
    Rect rect = new Rect(0, 0, widthCount * step, heightCount * step);
    dc.DrawImage(bitmap, rect);
}

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

Я благодарен этой теме: Масштабирование содержимого WPF перед рендерингом в растровое изображение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...