Модераторы: volvo877, Snowy, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с Графикой, Как работать с драйвером видеокарты 
:(
    Опции темы
nighthare
Дата 15.2.2006, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 24.12.2005

Репутация: нет
Всего: нет



Собственно вопрос такой. Если перерисовывать в паскале путем очистки экрана, то возникает не приятное моргание. Как можно работать с буфером видеокарты, чтобы дальше выводить обновленный экран? можно ли сделать например так, делаем 2-мерный массив, туда заносим нужные точки, потом передаем его видеокарте, она его отрисовывает? Интересует в первую очередь как это правильно реализовать в среде Pascal ( с примерам(и) ) (так же интересно как это сделать на .net, но это немного не в тот раздел smile )
PM MAIL   Вверх
remax
Дата 15.2.2006, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент
**


Профиль
Группа: Участник Клуба
Сообщений: 686
Регистрация: 7.4.2002
Где: Украина, Харьков

Репутация: нет
Всего: 5



В досе была возможность работы с виртуальными экранами. Один активен - на другом подготавливаем картинку. Затем меняем местами. Однако, из под Win многие досовские возможности режутся. Поэтому, надо определиться - под что писать прогу.


--------------------
Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку
PM MAIL ICQ Skype   Вверх
nighthare
Дата 15.2.2006, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 24.12.2005

Репутация: нет
Всего: нет



как ты сказал, очень классный вариант, но программа будет запускаться именно из Win...
PM MAIL   Вверх
karataev
Дата 15.2.2006, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 28.1.2006
Где: Россия, Нижний Но вгород

Репутация: нет
Всего: нет



Я предлагаю просто зарисовывать уже отработанные пиксели цветом фона, поэтому будет обновляться не весь экран, а только ненужные пиксели. Как раз можно сделать и с двухмерным массивом это.
PM MAIL WWW ICQ   Вверх
nighthare
Дата 16.2.2006, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 24.12.2005

Репутация: нет
Всего: нет



Думаю это не подходит по 2 причинам 1) либо это очень сложно просчитать математически и понять какие все-таки пиксели надо менять а какие нет 2) либо если я буду удалять отработанные и рисовать свои, то возникнет эффект моргания (весь монитор не будет моргать,а что я конкретно буду перерисовывать - будет, если фон и обьект контрастный, а если еще и фона как такового и нет...) Мой вопрос больше ориентирован на то, чтобы все это запихнуть по ближе к буферу видеокарты, чтоб я рисовал только следующий кадр(измененный)... я могу в терминологии (про буфер и т.д.) ошибаться, потому что не знаю как это идет на аппаратном уровне.
PM MAIL   Вверх
Ozzя
Дата 16.2.2006, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 19.7.2004

Репутация: нет
Всего: 1



Цитата

делаем 2-мерный массив, туда заносим нужные точки, потом передаем его видеокарте, она его отрисовывает

Тупиковый вариант, однозначно.

Цитата

из Win...


ТО есть нужен 32-х разрядный компилятор под win32

Цитата

работы с виртуальными экранами

Модуль Graph TMT Pascal'я 4 все это поддерживает.
PM MAIL   Вверх
nighthare
Дата 16.2.2006, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 24.12.2005

Репутация: нет
Всего: нет



Все пишется на Borland Turbo Pascal 7.0 ( это что-то вроде некого задания на семестр, я ищу подходу к этой теме, хочется сделать по красивее) запускается все это дело через виндовский эмулятор доса ( насколько я понимаю ) smile (если у кого есть примеры на эту тему для Borland C (C++) или под .NET (C#) , поделитесь smile )
PM MAIL   Вверх
Ozzя
Дата 16.2.2006, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 19.7.2004

Репутация: нет
Всего: 1



nighthare,
Тогда какие проблемы?
Режим EgaHi - 640X350
Две страницы аппаратных.
Нарисовали , поменяли страницу, Нарисовали


Это сообщение отредактировал(а) Ozzя - 16.2.2006, 17:10
PM MAIL   Вверх
volvo877
Дата 16.2.2006, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(nighthare @ 16.2.2006, 15:23 Найти цитируемый пост)
Все пишется на Borland Turbo Pascal 7.0


В таком случае копай в сторону процедур:
SetActivePage/SetVisualPage... И делай, как посоветовал remax, пока один экран ВИДИМ, другой устанавливаем АКТИВНЫМ, и готовим картинку. Как только подготовили - SetVisualPage на эту страницу - картинка появляется за 1 проход луча по монитору...


PM MAIL   Вверх
nighthare
Дата 16.2.2006, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 24.12.2005

Репутация: нет
Всего: нет



Спасибо, буду копать.
PM MAIL   Вверх
nighthare
Дата 17.2.2006, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 24.12.2005

Репутация: нет
Всего: нет



делаю так :
Код

{процедура}
cleardevice;
setactivepage(1);
{Здесь ставлю точки}
setvisualpage(1);

эффект моргания не пропал, но вроде стал меньше... есть еще какие-нибудь способы? (полный пример выложу в раздел помощи)
PM MAIL   Вверх
Ozzя
Дата 18.2.2006, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 19.7.2004

Репутация: нет
Всего: 1



refresh отслеживай
PM MAIL   Вверх
nighthare
Дата 18.2.2006, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 24.12.2005

Репутация: нет
Всего: нет



Простите за глупый вопрос, но как его отслеживать? Вместо cleardevice впихнул закраску всего экрана черным цветом(после setactivepage(1); перед setvisualpage(1);) получил ужасное моргание smile . В хэлпе вдобавок написано, что это работает толька на плате Hercules... Что я не правильно делаю?
PM MAIL   Вверх
cardinal
Дата 19.2.2006, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: нет
Всего: 99



Посмотри про двойную буфферизацию в инете. Именно это вариант решения проблемы моргания, при передвижении объектов. Но не уверен, что в данной ситуации подходящий. Но я бы капнул в эту сторону...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Ozzя
Дата 20.2.2006, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 19.7.2004

Репутация: нет
Всего: 1



Цитата(nighthare @ 18.2.2006, 16:33)
Простите за глупый вопрос, но как его отслеживать?

Ждем обратного хода луча
Код

Procedure WaitRetrace;Assembler; 
Asm 
 mov dx,$3DA 
 @lp: 
  in al,dx 
  and al,$08 
 jz @lp 
End; 

PM MAIL   Вверх
nighthare
Дата 20.2.2006, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 24.12.2005

Репутация: нет
Всего: нет



Ozzя, т.е. мы отрисовываем в setactivepage, после этого вставляем эту процедуру, потом setvisualpage? если не сложно, можешь прокоментировать в коде каждую строчку после Asm и до End; .
Added @ 15:12
Ozzя Он не моргает!!!!! просто супер!!!!!!!! большое спасибо!!! только обьясни пожалуйста что делают эти ассемблерные команды и как они работают....

Это сообщение отредактировал(а) nighthare - 20.2.2006, 15:14
PM MAIL   Вверх
Romikgy
Дата 20.2.2006, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: нет
Всего: 146



nighthare, а какой ф-цией ты рисуешь точки?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
nighthare
Дата 20.2.2006, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 24.12.2005

Репутация: нет
Всего: нет



Romikgy, putpixel...
Код

procedure T3d.draw(n:byte);
  var
   i,midx,midy:integer;
  begin
   setactivepage(0);
   cleardevice;
   midx:=round(getmaxx/2);
   midy:=round(getmaxy/2);
   for i:=1 to amount do
   begin
    putpixel(round(dp_dyn^[i].x)+midx,round(dp_dyn^[i].y)+midy,white);
   end;
   WaitRetrace;
   setvisualpage(0);
  end;

PM MAIL   Вверх
Romikgy
Дата 20.2.2006, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: нет
Всего: 146



nighthare, сиба
smile

Это сообщение отредактировал(а) Romikgy - 20.2.2006, 15:36


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Ozzя
Дата 20.2.2006, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 19.7.2004

Репутация: нет
Всего: 1



nighthare,

Код

Procedure WaitRetrace;  {ожидание вертикального обратного хода луча} 
Begin 
   While(Port[$3DA]and $08)=0 do; 
End; 


Дополнительно читать тут
http://emanual.ru/download/7045.html
PM MAIL   Вверх
Romikgy
Дата 20.2.2006, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: нет
Всего: 146



nighthare, а не проще ли будет взять адресс буфера видеостраницы и копировать массивами туда, а не
Цитата(nighthare @ 20.2.2006, 14:27 Найти цитируемый пост)
putpixel

?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
nighthare
Дата 20.2.2006, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 24.12.2005

Репутация: нет
Всего: нет



Romikgy, думаю проще, а как найти этот адрес, и как его взять в Pascal'e ? smile

Это сообщение отредактировал(а) nighthare - 20.2.2006, 16:24
PM MAIL   Вверх
Ozzя
Дата 20.2.2006, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 19.7.2004

Репутация: нет
Всего: 1



A000 - Для граф. режима ega/vva
Добавлено @ 17:00
Move( $a000,$a800,$800); - копирование
Как-то так.
1-я страница лежит по адресу $a000, вторая - начинается с $a800.
Фишка в том, что в режиме 640X350 копируются сразу все 4 плоскости (latches). Надо установить регистр контроллера. Какой - не помню.
Почитай Фроловых по ссылке. Там есть пример копирования.

Это сообщение отредактировал(а) Ozzя - 20.2.2006, 17:18
PM MAIL   Вверх
Romikgy
Дата 20.2.2006, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: нет
Всего: 146



обращение к памяти в паскале , на сколько помнится mem[seg:off]


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
nighthare
Дата 20.2.2006, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 24.12.2005

Репутация: нет
Всего: нет



Ozzя, а там едет так? я записываю точку с координатами 0,0 , увеличиваю адрес, записываю 0,1 ... 0,640 -> 1,0 и так далее? и как туда писать цвет точки( т.е. там усроено что либо true либо false, или либо false либо номер цвета? ) или можно как-то создать огромный массив и потом его целиком пихать в этот буфер?? smile

Added @ 17:09 буду читать и разбираться...

Это сообщение отредактировал(а) nighthare - 20.2.2006, 17:08
PM MAIL   Вверх
Romikgy
Дата 20.2.2006, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: нет
Всего: 146



это масссив точек заданый цветом каждой точки


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Ozzя
Дата 20.2.2006, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 19.7.2004

Репутация: нет
Всего: 1



Нет, режим 640Х350 сложнее.
Цитата

Режим 10h
Графический цветной режим с разрешением 640х350 пикселов. Данный режим поддерживают только видеоадаптеры EGA и VGA.

Для хранения видеоданных используются четыре цветовых слоя. Каждому пикселу соответствует по одному биту из каждого цветового слоя. Четыре бита на пиксел позволяют отображать 16 различных цветов. Запись в каждый из этих черырех слоев можно разрешить или запретить при помощи регистра разрешения записи цветового слоя.


Цитата

Рисунок 6.12 Структура видеопамяти режима 10h.

Если вы хотите выводить информацию на экран дисплея непосредственно через видеопамять, то необходимо уметь определять биты, которые управляют каждым пикселом изображения. Следующие формулы позволяют определить смещение байта от начала станицы видеопамяти и номер бита в нем, управляющего пикселом с координатами (x,y):

Смещение байта = 50h*y+x/8

Номер бита = 7-mod(x/8)


Это сообщение отредактировал(а) Ozzя - 20.2.2006, 17:16

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  IMG00017.GIF 5,13 Kb
PM MAIL   Вверх
Romikgy
Дата 20.2.2006, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: нет
Всего: 146



Ozzя, более точнее ответил smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
nighthare
Дата 20.2.2006, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 24.12.2005

Репутация: нет
Всего: нет



тогда вопрос, этот способ эффективнее чем putpixel? (если не считать что с его помошью наверное можно сделать двойную буферизацию) если да, то действительно будет работать заметно быстрее?
PM MAIL   Вверх
Ozzя
Дата 20.2.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 19.7.2004

Репутация: нет
Всего: 1



В принципе, bgi-графика достаточно быстра, за исключением заливки.
Никто не мешает рисовать во 2-й странице, и затем перебрасывать на 1-ю.
PM MAIL   Вверх
nighthare
Дата 20.2.2006, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 24.12.2005

Репутация: нет
Всего: нет



Ozzя,
Цитата(Ozzя @ 20.2.2006, 18:14 Найти цитируемый пост)
Никто не мешает рисовать во 2-й странице, и затем перебрасывать на 1-ю.
а как это правильно реализавать? в моем примере(выше) когда я очищаю память, рисую на странице, а потом ее отображаю(по идее это так должно быть), это не приводит к требуемуму результату (а если правильно делать рефреш то и без visual/active page все прекрасно работает (за исключением если рисовать что-то не putpixel'oм, тогда опять появляется моргание))

PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0710 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.