Страница: 1 |
Вопрос: Тормоза с Image | Добавлено: 03.12.08 03:08 |
Автор вопроса: ![]() |
Есть такая проблема. Написал код, который рисует в битмапе координатную сетку с графиком, которую мне затем нужно выводить через каждую 1/50 сек. на pictureBox без мерцания. При этой операции (Refresh или ...::Image = static_cast<...::Image^>(my_bitmap)...) прога зажрает весь процессор и что делать не знаю.
Как из битмапа можно вывести полученное изображение с минимальными затратами ресурсов проца? |
Ответы | Всего ответов: 6 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 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 Автор ответа: ![]() ![]() ![]() Вопросов: 9 Ответов: 16 |
Профиль | Цитата | #2 | Добавлено: 03.12.08 11:16 |
Я делаю немного по другому, сетку и график рисую вручую через биты изображения. Т.е. получаю указатель на область памяти, где реализован массив байт битмапа, при помощи функции Scan0. Доступ к области осуществляется при помощи функций LockBits. Всё это работает очень быстро. А вот когда готовый битмап присваюваю Image в PictureBox тут начинаются полные тормоза.
Вообщем этот битмап надо как-то выводить. Как быть в этом случае? |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 8068014 Вопросов: 18 Ответов: 817 |
Web-сайт: Профиль | Цитата | #3 | Добавлено: 03.12.08 12:06 |
сетку вообще не надо рисовать каждый раз. рисуется сетка в отдельный контекст, а потом BitBlt перед рисованием графика. Хз какие функции и типы в дотнете для этого, я так на апи делал. |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 58 Ответов: 4255 ![]() |
Профиль | Цитата | #4 | Добавлено: 03.12.08 12:53 |
хм.. ну если все так серьезно, то юзай тогда API (BitBlt как вариант) получай hDC ,и переноси напрямую. Одно непонятно.. нафига такая скорость? Ведь человеческий глаз по любому больше 25 кадр/сек не увидит |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() Вопросов: 9 Ответов: 16 |
Профиль | Цитата | #5 | Добавлено: 05.12.08 20:48 |
Народ, подскажите пожалуйста как правильно пользоваться функцией BitBlt. Как мне с помощью этой функции можно отобразить содержимое битмапа на pictureBox? Или скопировать содежимое с одной картинки в другую.
Вот фрагмен кода, функция возвращает 0.
|
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 8068014 Вопросов: 18 Ответов: 817 |
Web-сайт: Профиль | Цитата | #6 | Добавлено: 06.12.08 00:31 |
для работы BitBlt нужны не хэндлы окон, а графические контексты. Вот зря ты типы приводишь, если б не приводил, компилятор бы тебе объяснил, почему ошибка ![]() |
Страница: 1 |
|