Страница: 1 |
Страница: 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 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-сайт:
Профиль | | #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.
Номер ответа: 6
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #6
Добавлено: 06.12.08 00:31
для работы BitBlt нужны не хэндлы окон, а графические контексты. Вот зря ты типы приводишь, если б не приводил, компилятор бы тебе объяснил, почему ошибка