Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Predlegion
3 / 3 / 0
Регистрация: 21.01.2011
Сообщений: 27
#1

Быстрая прорисовка виртуального окна в реальном времени - C++

09.10.2011, 22:11. Просмотров 981. Ответов 2
Метки нет (Все метки)

Описание задачи: Есть приложение работающее в реальном времени и требующее обновление области экрана "попиксельно" со скоростью не хуже чем 24 раза в секунду.

Область экрана имеет размеры 1024 *300.

Работа идет след образом: Сначала изображение рисуется попиксельно в виртуальном окне а затем с помощью BilBlt выводится на форму.

Как рисуется изображение в виртуальном окне:
C++
1
2
3
for(int i=0;i<n;i++)
 for(int j=0;j<m;j++)
   ::SetPixel(Bm,i,j,RGB(a[i][j],0,0));
Как изображение выводится:


BitBlt(hdscreen,0,0,1024,300,Bm_hdc,0,0,SRCCOPY);




Все выводится нормально, НО возникает проблема больших тормозов.
Видимо,что если с помощью ::SetPixel(Bm,i,j,RGB(a[i][j],0,0)); пробегать 24 раза в секунду весь массив
1024*300 ,то это будет тяжеловато.

Вопрос заключается в том, как можно быстро прорисовать все пиксели в виртуальном окне?

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

Добавлено через 16 минут
Ах да еще забыл сказать что такое Bm и Bm_hdc

C++
1
2
3
4
5
6
HDC Bm,Bm_hdc,hdscreen;
 
 
hdscreen=GetDC(Form1->Handle)
Bm=CreatCompatibleBitmap(hdscreen,1024,300);
Bm_hdc=CreatCompatibleDC(hdscreen);
Добавлено через 7 часов 14 минут
UPDATE

Решил выводить изображение в форме Bitmap на с помощью Canvas->Draw:

1)Сначала изображение записывается в Bitmap с помощью ScanLine.
2)Затем этот Bitmap выводится на форму с помощью Canvas->Draw:


Но проблему это все же не решило,точнее решало на 20% .
Тормоза ушли, но все равно процедура перерисовки ест много ресурсов(процессор загружен моим приложением на 30%).На слабом компе начинает подтормаживать

При этом установлено,что сама процедура Canvas->Draw почти не есть системные ресурсы(около
1-2%).

Большую часть ресурсов съедает сам процесс перезаписи Bitmap через ScanLine

Необходимо найти более быстрый способ доступа.

Можно ли каким-либо образом обратиться к памяти Bitmap как к обычному двумерному массиву?
Потому что нынешнее быстродействие не устраивает
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.10.2011, 22:11     Быстрая прорисовка виртуального окна в реальном времени
Посмотрите здесь:
C++ Игра в реальном времени
Парсинг логфайла в реальном времени Visual C++
C++ WinAPI Отображение графика в реальном времени
Звуковая карта в реальном времени C++ Builder
Отрисовка графика в реальном времени C++ Builder
C++ Работа программы в реальном времени
Обработка EDIT в реальном времени C++ WinAPI
C++ Builder Вывод графика в реальном времени
График функции в реальном времени C++ Builder
Клонирование компонентов в реальном времени C++ Builder
Определение частоты процессора в реальном времени C++ Builder
Обработка сигнала микрофона в реальном времени C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 1
Завершенные тесты: 1
10.10.2011, 04:34     Быстрая прорисовка виртуального окна в реальном времени #2
SetPixel() (как и GetPixel()) нереально медленные ф-ции, особенно на семерке. Рисуй "руками" в контексте ус-ва, потом BitBlt().
Может поможет, вот "ручная" реализация GetPixel() (там в конце пары строк не хватает - удаление созданный объектов), если разберешся, можешь SetPixel() по аналогии сделать.
Predlegion
3 / 3 / 0
Регистрация: 21.01.2011
Сообщений: 27
11.10.2011, 03:00  [ТС]     Быстрая прорисовка виртуального окна в реальном времени #3
Спасибо,вроде бы начинает помогать.
Быстродействие детально оценю чуть позже.

Только почему то не могу назначить пикселю 8-ми битный цвет,только RGB.
При определении в BITMAPINFO необходимых настроек наблюдается черный экран
Пишу я следующее:
C++
1
2
3
4
5
6
7
8
9
BMI.bmiHeader.biSize = sizeof(BMI.bmiHeader);
        BMI.bmiHeader.biWidth = 1024;
        BMI.bmiHeader.biHeight = 200;
        BMI.bmiHeader.biPlanes = 1;
        BMI.bmiHeader.biBitCount = 8;
        BMI.bmiHeader.biCompression = BI_RGB;
        BMI.bmiHeader.biSizeImage=1;
        BMI.bmiHeader.biClrUsed = 0;
        BMI.bmiHeader.biClrImportant = 0;
Добавлено через 1 час 0 минут
UPDATE

Еще вроде бы заметил странное явление:

Движущийся Битмап ест намного больше ресурсов чем статический битмап,но обновляющийся с той же частотой.
Т.е например битмап обновляется по таймеру:
В первом случае пикселям присваиваются одни и те же константы,а в другом случае-другие уникальные значения.
Так вот во втором случае наблюдается резкий рост прожорливости системы.

Не знаете с чем это может быть связано?

Добавлено через 3 часа 11 минут
UPDATE

Насчет быстродействия: Нашел ошибку ,из-за которой уходили системные ресурсы.
А Ошибка примерно вот какая:
C++
1
2
3
4
5
float a[200][1024];
DWORD b[200][1024];
for(int i=0;i<n;i++)
 for(int j=0;j<m;j++)
      b[i][j]=a[i][j]

Приложение жрало 25 % ресурсов от всей системы,потому что переменная типа float присваивалась переменной типа DWORD.
Никак не пойму почему это было так тяжело для системы.

По поводу прорисовки:да,действительно очень быстрый метод.
Осталось еще понять как в функцию SetDIBits правильно передать указатель на динамический массив с пикселями. Потому что получается или черный экран или билиберда
Yandex
Объявления
11.10.2011, 03:00     Быстрая прорисовка виртуального окна в реальном времени
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru