Другие языки программирования и технологии

О графическом режиме ТурбоПаскаля и о маленькой проблемме, скоторой я столкнулся...

Понимаете, в чем дело...При частой очистке экрана и прорисовке элементов создается эффект мерцания, как на старом ЭЛТ-мониторе.Вот, к примеру, мини-программа как пример.--------------------program graph1;uses crt,graph;var q,q1:integer;beginDetectGraph(q,q1);InitGraph(q,q1,'');while not keypressed dobeginClearDevice;setfillstyle(1,3);Bar(0,0,640,480);delay(3000);end;CloseGraph;End.--------------------Здесь идет простая очистка экрана, потом строится закрашенный прямоугольник и так пока не будет нажата любая клавиша.Но экран мельтешит и во всех программах, написанных мной на паскале с использованием модуля graph.В чем же дело? Почему это происходит и можно ли с этим бороться? Заранее благодарю)
Юра Сандрунов
Юра Сандрунов
4 076
Дело в том, что экран успевает перерисоваться несколько раз за то время, пока он "очищается".
Графическая подсистема Паскаля, по крайней мере, стандартная, очень медленная -- она работает в режиме 640x480, с использованием специального режима видеокарты -- битовые панели, регистры.. . Жуть, короче.

Для того чтобы этого не было, обычно используются такие техники, как трассировка обратного хода луча (то есть экранная память перезаписывается в тот момент, когда луч CRT бежит "обратно"), а также режим нескольких экранных областей -- в этом случае мы рисуем на "скрытом" экране, а показываем открытый -- а для следующего кадра меняем экраны местами, скрытый становится открытым и наоборот.

Впрочем, эти технологии были популярны во времена DOS, а сейчас они уже несколько.. . э.. . устарели.

Из более-менее современных решений -- это, например, использование API операционной системы или ее графической подсистемы для рисования (GDI / DirectDraw в Windows, XWindow в Linux/BSD/Solaris/Etc), или, если уж так хочется DOS, то использование VESA функций. Их, конечно, прийдется поискать (TPU-модули для паскаля, например, я не встречал, равно как и библиотек для BC3 -- писал обработчики сам. Это не так уж и сложно, кстати... )
Нурбек Эргешов
Нурбек Эргешов
10 997
Лучший ответ
Юра Сандрунов >режим нескольких экранных областей -- в этом случае мы рисуем на "скрытом" экране, а показываем открытый -- а для следующего кадра меняем экраны местами, скрытый становится открытым и наоборот.

А можно немного подробнее, как это - менять экраны?
погляди справку на команды GetImage и PutImage. С ними ниче мерцать не будет.
Смотри, ты чистишь экран, а потом рисуешь, как будто выключаешь - включаешь лампочку.
Если тебе не нужна предыдущая картинка, просто перерисовывай ее - выкинь ClearDevice, а SetFillStyle(1,3); поставь ПЕРЕД циклом (зачем одно и то же делать?) .

Если предыдущая картинка (или ее части) нужна, попробуй строить ВСЕ изображение "за экраном", т. е. Bar(0,0, -640, -480); и в нужный момент выводить его полностью просто заменяя -640, -480 на 640, 480
Юра Сандрунов Это простенькая программа.
Вот более сложная игрушка, моя, самодельная
http://files.mail.ru/BYXGGU

Там уже все посложнее, но с мерцанием экрана та же фигня)
я обычно в паскале делаю листание видеостраниц, чтобы не так сильно мерцало
Юра Сандрунов А как делается это листание? Я только недавно начал графику изучать просто))
Віталік Побуцький вот тут кое че написано по этому поводу
book.kbsu.ru/practice/2_8/2_8_10.html