|
|
  |
Програмирование графики, вопрос |
|
|
|
Sep 3 2016, 11:51
|
Местный
  
Группа: Участник
Сообщений: 364
Регистрация: 25-09-08
Пользователь №: 40 483

|
Цитата(AHTOXA @ Sep 3 2016, 14:10)  Вы же сами в стартовом посте написали про 0.1с. Вот это и есть 100мс. А 1000FPS вы никакими BitBlt и OpenGl-ями не получите. Урежьте осетра  Чета я не то сказал ))) Реально хотелось бы достичь макс скорость 5 сек на весь экран, это 5/1100 = 4,5 мс/столбец ну а тут как получиться Цитата(_pv @ Sep 3 2016, 14:17)  с glCopyPixels сдвинуть текущую картинку на один пиксель и через glDrawPixels дорисовать только один недостающий столбец. никаких дополнительных буферов в этом случае вообще не надо. Осталось все это нарисовать в коде ) Цитата(Onkel @ Sep 3 2016, 13:47)  я еще когда в 90е делал систему сдирания буржуйских чипов для наших конфетных харь, готовил следующий экран в памяти, vga имело буфер размером со всю экранную память, и потом просто переключал память, выводимую на экран. Ну тут кроме это окна еще куча других работает, копировать весь экран не получиться. Такое предлагаю, создаем матрицу размер +1 по х, вводим новые значения в правый столбец, выводим в канву со сдвигом -1 (чтобы новые данные появились справа) копируем полученную канву в матрицу с нуля, и тд. Типа того, работает но жрет ресурсов столько же как предыдущие варианты ( похоже это типа тоже тупое копирование массива а не сдвиг указателя памяти TRect tRectFrom(1,0,1101,800); TRect tRectTo (0,0,1100,800); Image1->Canvas->CopyMode=cmSrcCopy; Image1->Canvas->CopyRect(tRectTo,gBitmap->Canvas,tRectFrom); TRect tRectFrom2(0,0,1100,800); TRect tRectTo2 (0,0,1100,800); gBitmap->Canvas->CopyRect(tRectTo2,Image1->Canvas,tRectFrom2); for ( y = 0; y < h1; y++) { ptr = (Byte *)gBitmap->ScanLine[y]; ptr[3300+0] = (Byte)Col; ptr[3300-1] = (Byte)0; ptr[3300-2] = (Byte)0; ptr[3300-3] = (Byte)Col; ptr[3300-4] = (Byte)0; ptr[3300-5] = (Byte)0; ptr[3300-6] = (Byte)Col; ptr[3300-7] = (Byte)0; ptr[3300-8] = (Byte)0; } ps а не , был не прав, вроде меньше нагрузка ...
Сообщение отредактировал Herz - Sep 3 2016, 12:35
|
|
|
|
|
Sep 3 2016, 12:35
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(whale_nik @ Sep 3 2016, 14:51)  . . . . Ну тут кроме это окна еще куча других работает, копировать весь экран не получиться. . . . . Если Вам эта работа нужна в качестве инструмента. В винде, по крайней мере в XP, можно "монополизировать" экран, те. фактически работать без окон, графика в полноэкранном режиме. (я давненько игрался с этим режимомом для реализации простого, но длинного графика-лога с удобным скроллингом мышкой и масштабированием) Окон естесетвенно, нет. Ваш график отображается реалтайм. При восстановлении стандартного режима, окно "свертывается", с упрощенным отрбражением, скроллинг загрубляется, например, до 20 позиций раз по полсекунды.
|
|
|
|
|
Sep 3 2016, 12:38
|
Местный
  
Группа: Участник
Сообщений: 364
Регистрация: 25-09-08
Пользователь №: 40 483

|
Без окон никак, увы. Вот вроде бы нагрузка небольшая получилась...
Сообщение отредактировал Herz - Sep 3 2016, 17:24
Причина редактирования: Избыточное цитирование
|
|
|
|
|
Sep 3 2016, 12:44
|
Местный
  
Группа: Участник
Сообщений: 364
Регистрация: 25-09-08
Пользователь №: 40 483

|
Цитата(DASM @ Sep 3 2016, 16:43)  а почему побайтно работаете и не пословно? Не понял вопроса, в смысле цвета ?
Сообщение отредактировал whale_nik - Sep 3 2016, 16:52
|
|
|
|
|
Sep 3 2016, 13:16
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(whale_nik @ Sep 3 2016, 16:51)  Чета я не то сказал ))) Реально хотелось бы достичь макс скорость 5 сек на весь экран, это 5/1100 = 4,5 мс/столбец ну а тут как получиться 4,5 мс - это 222 герца. Тоже многовато. Вы примите во внимание, что для человеческого глаза не нужна такая частота. Достаточно, скажем, 60 Гц (вернее, достаточно 25, а 60 - это будет ультра-гладкая картинка). Вот и перерисовывайте соответственно 60 раз в секунду. Пусть за одну перерисовку у вас добавляется не один, а несколько столбцов.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Sep 3 2016, 17:42
|
Местный
  
Группа: Участник
Сообщений: 364
Регистрация: 25-09-08
Пользователь №: 40 483

|
Цитата(AHTOXA @ Sep 3 2016, 17:16)  4,5 мс - это 222 герца. Тоже многовато. Вы примите во внимание, что для человеческого глаза не нужна такая частота. Достаточно, скажем, 60 Гц (вернее, достаточно 25, а 60 - это будет ультра-гладкая картинка). Вот и перерисовывайте соответственно 60 раз в секунду. Пусть за одну перерисовку у вас добавляется не один, а несколько столбцов. 4,5 это не обновление картинки а добавление одного столбца, а частота окна получиться 5 сек если считать кадром обновление всего окна. Цитата(amaora @ Sep 3 2016, 17:26)  В лоб будет больше 60 к/с, если оптимизировать как должно, немного медленнее memcpy. А можно и взять готовый memmove, останется добавлять один столбец. Выводить можно через libsdl. Вы говорите для меня загадками ) Господа, вот такая штука виснет намертво и ничего не выводит, если без goto в таймере вызывать все отлично, в чем дело ? int h1 = gBitmap->Height; int w1 = 3300; fg: Col--; for ( y = 0; y < h1; y++) // âàðèàíò 2 = ìåíÿåì â ìàñèâå òîëüêî îäèí ñòîëáåö { data_in[0][y]=random(250); data_in[1][y]=random(250); data_in[2][y]=random(250); } //----------------------------------- TRect tRectFrom(1,0,1101,h1); TRect tRectTo (0,0,1100,h1); Image1->Canvas->CopyMode=cmSrcCopy; Image1->Canvas->CopyRect(tRectTo,gBitmap->Canvas,tRectFrom); TRect tRectFrom2(0,0,1100,h1); TRect tRectTo2 (0,0,1100,h1); gBitmap->Canvas->CopyRect(tRectTo2,Image1->Canvas,tRectFrom2); for ( y = 0; y < h1; y++) { ptr = (Byte *)gBitmap->ScanLine[y]; ptr[w1+0] = (Byte)data_in[0][y]; ptr[w1-1] = (Byte)data_in[1][y]; ptr[w1-2] = (Byte)data_in[2][y]; } //----------------------------------- Sleep(100); goto fg;
|
|
|
|
|
Sep 3 2016, 17:46
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
Ребят, я не понимаю зачем нам тут gl и уж тем более полноэкранная графика с монополизацией экрана.... Компонент лежит на форме и может предоставить свой DC(Device Context). Этот контекст как раз позволит рисовать в заданную область на форме(в окне). Зачем лезть в gl если есть более стандартные функции из GDI. Сделать это всё на Canvas вместо Image и будет счастье. Я бы взял за основу вот этот пример, где есть скроллинг битмэпа https://msdn.microsoft.com/ru-ru/library/wi...0(v=vs.85).aspxИспользуется как раз BitBlt() Device context у нас есть, буфер сделать нет проблем... в целом тоже нет проблем ) Ежели кто-то сможет пояснить за использование GL в данном случае то я бы с интересом почитал.
--------------------
The truth is out there...
|
|
|
|
|
Sep 3 2016, 17:58
|
Местный
  
Группа: Участник
Сообщений: 364
Регистрация: 25-09-08
Пользователь №: 40 483

|
Цитата(AHTOXA @ Sep 3 2016, 17:16)  Вот 5 сек на весь экран примерно 5мс/столбец, не вижу тут мега быстрого чего то .
|
|
|
|
|
Sep 3 2016, 19:09
|
Местный
  
Группа: Участник
Сообщений: 364
Регистрация: 25-09-08
Пользователь №: 40 483

|
Цитата(sigmaN @ Sep 3 2016, 22:31)  Логичнее было бы в архив прилепить исходник, вместо этого безобразия Пардон, попробуйте этот
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|