Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рисование в фоновом потоке 
V
    Опции темы
mgukov
Дата 10.4.2011, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 22.3.2009

Репутация: нет
Всего: нет



Здравствуйте. Задача такая

Моделируется некоторый тех процесс, результат моделирования должен отображаться в виде диаграммы в реальном времени. Диаграмма довольно сложная, поэтому рисование ее в основном потоке невозможно, а как нарисовать ее в фоновом потоке тоже не понятно. Как можно решить данную задачу в WPF?

Возможен ли такой подход - в фоновом потоке создаем объект DrawingVisual, рисуем с помощью него диаграмму, а затем полученную "картинку" каким то образом через Dispetcher.Invoke рисуем на форме?
PM MAIL   Вверх
under_sun
Дата 10.4.2011, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 3.10.2007
Где: Ебург

Репутация: 1
Всего: 17



Что понимается под сложностью диаграммы? Если сложность расчетов, то расчеты проводи в другом потоке, а диаграмму рисуй уже по просчитанным точкам.
--------------------
TMTOWTDI
PM MAIL ICQ   Вверх
mgukov
Дата 10.4.2011, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 22.3.2009

Репутация: нет
Всего: нет



Под сложностью понимается главным образом большое число элементов (квадратов) из которых состоит диаграмма
PM MAIL   Вверх
mgukov
Дата 11.4.2011, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 22.3.2009

Репутация: нет
Всего: нет



Видимо я использую WPF не по назначению.

Мне нужно визуализировать результат моделирования, а результат моделирования - массив[300, 300] (тепловое поле). Для каждой точки я рисую квадрат, цвет которого зависит от температуры в данной точке. Векторная графика мне не нужна, а вот высокая скорость желательна.

Подскажите чем можно воспользоваться для моей задачи в WPF.
PM MAIL   Вверх
-Mikle-
Дата 11.4.2011, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 13
Всего: 59



Ну можете тогда рисовать в битмапе в отдельном потоке и по окончанию растровую картинку давать основному потоку. Но я что-то сомневаюсь, что 90000 квадратиков долго рисуются. Они могут долго прорисовываться (так как вы рисуете векторно), но сам процесс рисования по идее должен быстро проходить.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
mgukov
Дата 11.4.2011, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 22.3.2009

Репутация: нет
Всего: нет



Пример
Код

DrawingVisual dv = new DrawingVisual();
DrawingContext dc = dv.RenderOpen();

for(iny i = 0; i < length; ++i) // length = 90000, квадраты размером 2x2 пиксела
{
    dc.DrawRectangle(brush, pen, rect);
}

dc.Close(); // самая долговыполняющаяся часть кода (несколько секунд)



Может быть я что-то не правильно делаю?
А как прорисовывание ускорить, если дело в нем?

Это сообщение отредактировал(а) mgukov - 11.4.2011, 11:04
PM MAIL   Вверх
-Mikle-
Дата 11.4.2011, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 13
Всего: 59



Само прорисовывание никак, насколько я знаю (может кто-то и поделится, если знает как). Рисуйте в битмапе фоново (DrawingContext из битмапа получите), а потом передадите готовый рисунок для отображения.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
mgukov
Дата 11.4.2011, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 22.3.2009

Репутация: нет
Всего: нет



А в битмапе рисовать средствами System.Drawing? Или в WPF есть что нибудь для растровой графики?
PM MAIL   Вверх
-Mikle-
Дата 11.4.2011, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 13
Всего: 59



Нет, зачем. Все есть. Вот один из способов.

Код

     DrawingVisual drawingVisual = new DrawingVisual();
     using (DrawingContext drawingContext = drawingVisual.RenderOpen())
     {
         // рисуем
     }

     RenderTargetBitmap bitmap = new RenderTargetBitmap(width, height, dpi, dpi, PixelFormats.Default);
     bitmap.Render(drawingVisual);

     // все, bitmap готов



--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
under_sun
Дата 11.4.2011, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 3.10.2007
Где: Ебург

Репутация: 1
Всего: 17



Ради интереса попробовал у себя. Код drawingContext.Close() выполняется за 250-270 мс.

Код такой:
Код

public void Update ( Color[] colors )
{
     var drawingContext = _visual.RenderOpen();
     int k = 0;
     for ( int i = 0; i < 300; i++ )
     {
          for ( int j = 0; j < 300; j++ )
          {
                var rect = new Rect( new Point( j * 2, i * 2 ), new Size( 2, 2 ) );
                drawingContext.DrawRectangle( new SolidColorBrush( colors[k++] ), null, rect );
          }
      }
      drawingContext.Close();
}


Конечно, может у тебя комп послабже, но все равно разница кажется слишком большой.

Цитата(-Mikle- @ 11.4.2011,  13:04)
Нет, зачем. Все есть. Вот один из способов.

Код

     DrawingVisual drawingVisual = new DrawingVisual();
     using (DrawingContext drawingContext = drawingVisual.RenderOpen())
     {
         // рисуем
     }

     RenderTargetBitmap bitmap = new RenderTargetBitmap(width, height, dpi, dpi, PixelFormats.Default);
     bitmap.Render(drawingVisual);

     // все, bitmap готов

Тут все равно вызывается тот же drawingContext.Close().

--------------------
TMTOWTDI
PM MAIL ICQ   Вверх
mgukov
Дата 11.4.2011, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 22.3.2009

Репутация: нет
Всего: нет



Возможно я погорячился, написав несколько секунд
Комп вроде нормальный, но в параллельном потоке еще сама модель работает, и все же скорость у меня получается не удовлетворительная, тоже самое с помощью OpenGL (Tao Framework) рисуется гораздо быстрей.


Спасибо всем за помощь, понял что мне надо почитать литературу, поглубже разобраться с WPF
PM MAIL   Вверх
-Mikle-
Дата 13.4.2011, 06:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 13
Всего: 59



Цитата(under_sun @  11.4.2011,  21:09 Найти цитируемый пост)
Тут все равно вызывается тот же drawingContext.Close().

Ну я не спорю, пример был приведен для рисования в битмапе, чтобы если человеку надо, то он мог в отдельном потоке сделать это.

Цитата(mgukov @  11.4.2011,  00:51 Найти цитируемый пост)
как нарисовать ее в фоновом потоке тоже не понятно

Цитата(mgukov @  11.4.2011,  00:51 Найти цитируемый пост)
Возможен ли такой подход - в фоновом потоке создаем объект DrawingVisual, рисуем с помощью него диаграмму, а затем полученную "картинку" каким то образом через Dispetcher.Invoke рисуем на форме?

Цитата(mgukov @  11.4.2011,  14:59 Найти цитируемый пост)
А в битмапе рисовать средствами System.Drawing? Или в WPF есть что нибудь для растровой графики? 


Вот к этим вопросам был приведен минипример.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0788 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.