Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Тормоза с Image Добавлено: 03.12.08 03:08  

Автор вопроса:  Oleg
Есть такая проблема. Написал код, который рисует в битмапе координатную сетку с графиком, которую мне затем нужно выводить через каждую 1/50 сек. на pictureBox без мерцания. При этой операции (Refresh или ...::Image = static_cast<...::Image^>(my_bitmap)...) прога зажрает весь процессор и что делать не знаю.
Как из битмапа можно вывести полученное изображение с минимальными затратами ресурсов проца?

Ответить

  Ответы Всего ответов: 6  

Номер ответа: 1
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #1 Добавлено: 03.12.08 08:32
Написал код, который рисует в битмапе координатную сетку с графиком, которую мне затем нужно выводить через каждую 1/50 сек. на pictureBox


Другими словами каждые 1/50 sec происходит следующее:
- создаешь объект Bitmap
- создаешь из него объект Graphics
- рисуешь координатную сетку
- рисуешь график
- убиваешь предыдущий рисунок в PictureBox и освобождаешь ресурсы
- полученный Bitmap перемещаешь в PictureBox
Я все верно понял?

Тебе в этой схеме ничего не кажется странным?
Почему бы тебе не рисовать сразу в PictureBox или на форме? Таким образом ты избавишься от всех манипуляций с Bitmap'ами и освободишь кучу ресурсов и процессорного времени.
Кроме того.. считаю, что в твоем случае было бы правильней наследоваться от UserControl, выставить ему биты DoubleBuffered и ResizeRedraw, переопределить OnPaint и OnPaintBackground и рисуй там что твоей душе угодно! Причем сетку целесообразней всего рисовать именно в OnPaintBackground потому как она, скорее всего величина статическая, и меняться не будет. Кроме всего этого есть еще масса способов оптимизации графических операций(например сетку рисовать не по одной линии в цикле, а использовать DrawLines который принимает в качестве аргумента массив линий и все их рисует одним разом), но их уже надо рассматривать в контексте конкретной задачи.

Ответить

Номер ответа: 2
Автор ответа:
 Oleg



Вопросов: 9
Ответов: 16
 Профиль | | #2 Добавлено: 03.12.08 11:16
Я делаю немного по другому, сетку и график рисую вручую через биты изображения. Т.е. получаю указатель на область памяти, где реализован массив байт битмапа, при помощи функции Scan0. Доступ к области осуществляется при помощи функций LockBits. Всё это работает очень быстро. А вот когда готовый битмап присваюваю Image в PictureBox тут начинаются полные тормоза.
Вообщем этот битмап надо как-то выводить.
Как быть в этом случае?

Ответить

Номер ответа: 3
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #3
Добавлено: 03.12.08 12:06
сетку вообще не надо рисовать каждый раз. рисуется сетка в отдельный контекст, а потом BitBlt перед рисованием графика. Хз какие функции и типы в дотнете для этого, я так на апи делал.

Ответить

Номер ответа: 4
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #4 Добавлено: 03.12.08 12:53
хм.. ну если все так серьезно, то юзай тогда API (BitBlt как вариант) получай hDC ,и переноси напрямую. Одно непонятно.. нафига такая скорость? Ведь человеческий глаз по любому больше 25 кадр/сек не увидит

Ответить

Номер ответа: 5
Автор ответа:
 Oleg



Вопросов: 9
Ответов: 16
 Профиль | | #5 Добавлено: 05.12.08 20:48
Народ, подскажите пожалуйста как правильно пользоваться функцией BitBlt. Как мне с помощью этой функции можно отобразить содержимое битмапа на pictureBox? Или скопировать содежимое с одной картинки в другую.

Вот фрагмен кода, функция возвращает 0.

  1.  
  2.  if(BitBlt((HDC)this->pictureBox2->Handle.ToInt32(),0,0,this->pictureBox1->Width,this->pictureBox1->Height,
  3. (HDC)this->pictureBox1->Handle.ToInt32(),0,0,0)==0)
  4. MessageBoxA((HWND)this->Handle.ToPointer(),"fail","fail",16);

Ответить

Номер ответа: 6
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #6
Добавлено: 06.12.08 00:31
для работы BitBlt нужны не хэндлы окон, а графические контексты. Вот зря ты типы приводишь, если б не приводил, компилятор бы тебе объяснил, почему ошибка =)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам