Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.147.66.178] |
|
Сообщ.
#1
,
|
|
|
Какие есть способы сделать графику плавной (что бы при смене изображения не моргал экран)
В TP, можно было переключать видеостраницы, есть ли подобные средства при использовании windows графических режимов. Тех. инфрмация: компилятор FPC, граф. библиотека: GraphiX (поддержка DirectX) Заранее спасибо за ответы! |
Сообщ.
#2
,
|
|
|
Этот метод одинаков для всех языков: двойная буферизация.
Идея состоит в следующем - рисуем сначала не в видеопямять, а, например, в массив. И потом этом массив одной командой выводим на экран |
Сообщ.
#3
,
|
|
|
А переключение видеостраниц - это древний и абсолютно не оправдывающий себя метод. От его использования лучше всего избавиться и в TP.
|
Сообщ.
#4
,
|
|
|
Не понимаю, почему способом 2-ой буферизации быстрее, чем сначало загнать пиксели в видеопамять и вывести на экран. Если считать все в массиве, то зачем нужны такие большие объемы видеопамяти, 1 мегабайта хватило бы?
И как одной командой можно вывести значение массива на экран? |
Сообщ.
#5
,
|
|
|
Потому что видеопамять медленнее оперативной.
|
Сообщ.
#6
,
|
|
|
Вот этого я не знал- даже и не задумывался, что она медленние!
А как насчет вопрос 2 и 3? |
Сообщ.
#7
,
|
|
|
2. В современных видеокартах видеопамять используется для хранения текстур при 3d-построении. Под дос используя окно в A000 память работает медлено. А быстро она работает в самой видеокарте, из винды ей можно давать команды, которые она выполняет, работая с памятью, котрая наиболее близка к видеопроцессору (тобишь на плате видеокарты). Реализацией основного набора команд для видеокарт современного поколения занимаются драйвера видеокарт под ОС (например драйвера под винду). Над драйверами идёт надстройка к примеру в виде DirectDraw/3d, реализуя уже удобные для использования функции.
3. Что значит значение массива? все элементы массива в текстовом виде? какого типа данные в массиве? Поясни что требуется |
Сообщ.
#8
,
|
|
|
Что-то я запутался!!
Цитата Этот метод одинаков для всех языков: двойная буферизация. Идея состоит в следующем - рисуем сначала не в видеопямять, а, например, в массив. И потом этом массив одной командой выводим на экран и Цитата В современных видеокартах видеопамять используется для хранения текстур при 3d-построении...А быстро она работает в самой видеокарте, из винды ей можно давать команды, которые она выполняет, работая с памятью, котрая наиболее близка к видеопроцессору Непонимаю. Из первого утверждения следует , что быстрее работает в оперативной памяти- из 2-ого- в видеопамяти... |
Сообщ.
#9
,
|
|
|
небольшие рисунки можно рисовать во время обратного хода кадровой развертки.
На TP я это делал так : while (port[$3da] and 8) = 0 do; {собственно рисование} |
Сообщ.
#10
,
|
|
|
Цитата Newer @ 18.10.04, 10:54 Непонимаю. Из первого утверждения следует , что быстрее работает в оперативной памяти- из 2-ого- в видеопамяти... Нет, всё в порядке. 2-е утверждение означает, что задействуются "вшитые" команды видепроцессора, которые соответственно быстрее. |
Сообщ.
#11
,
|
|
|
To FilosofНу этим я тоже полбзовался на БП- это Retrace;
Цитата 2-е утверждение означает, что задействуются "вшитые" команды видепроцессора, которые соответственно быстрее. Ага..! Значит можно использовать 2-ую буферизацию и также видео память, управлять кот. можно с помощью спец команд процессора! Этими командами можно пользоваться с помощью OpenGl и DirectX/Draw??? |
Сообщ.
#12
,
|
|
|
Я уже описал. Не путай центральный процессор и процессор на видеокарте.
Вот смотри - у тебя на компе есть центральный процессор. Он считает и обрабатывает практически всю информацию, которая необходимо. Но есть ещё и видеокарта - на ней свой процессор, не такой мощный как центральный, но он оптимизирован для других задач. Он сделан для того, чтобы обрабатывать графические данные, и выводить их в видеопамять (а так же на экран). Центральный процессор только косвенно управляет, какие данные следует обрабатывать видеопроцессору, даёт ему общие команды. А эти комнады реализуются уже видеопроцессором на видеокарте, потому что он быстрее справляется и специально сделан для таких задач. Говоря о видекарте я имею ввиду более или менее новые карты. Так вот для работы с видеопроцессором таких карт написаны драйвера для этих видеокарт. Они обобщают специфические особенности разных видеокарт и формируют из них общий стандарт для работы с графикой, чтобы не зависимо от карты одним и тем же кодом можно было заставить выполнять её нужные действия. Но драйвера реализуют очень мелкие команды (на подобе ассемблерных). И ими пользоваться не удобно. ПОэтому над драйверами в виндовсе есть графические надстройки вроде Open-GL и DirectX. Уже они формируют процедуры и функции, которыми удобно пользоваться программисту. К сожалению все эти преимущества недоступны простому программисту под ДОС. Поскольку для ДОС-а не пишут драйверов под новые видеокарты, нет единого доступного интерфейса для управления внутренними командами этих видеокарт. И поэтому приходится пользоваться стандартными методами и при помощи центрального процессора копировать наборы байт из одного места в памяти в другое. |
Сообщ.
#13
,
|
|
|
Цитата Some1 @ 27.10.04, 00:15 Я уже описал. Не путай центральный процессор и процессор на видеокарте. Вот смотри - у тебя на компе есть центральный процессор. Он считает и обрабатывает практически всю информацию, которая необходимо. Но есть ещё и видеокарта - на ней свой процессор, не такой мощный как центральный, но он оптимизирован для других задач. Он сделан для того, чтобы обрабатывать графические данные, и выводить их в видеопамять (а так же на экран). Центральный процессор только косвенно управляет, какие данные следует обрабатывать видеопроцессору, даёт ему общие команды. А эти комнады реализуются уже видеопроцессором на видеокарте, потому что он быстрее справляется и специально сделан для таких задач. Говоря о видекарте я имею ввиду более или менее новые карты. Так вот для работы с видеопроцессором таких карт написаны драйвера для этих видеокарт. Они обобщают специфические особенности разных видеокарт и формируют из них общий стандарт для работы с графикой, чтобы не зависимо от карты одним и тем же кодом можно было заставить выполнять её нужные действия. Но драйвера реализуют очень мелкие команды (на подобе ассемблерных). И ими пользоваться не удобно. ПОэтому над драйверами в виндовсе есть графические надстройки вроде Open-GL и DirectX. Уже они формируют процедуры и функции, которыми удобно пользоваться программисту. К сожалению все эти преимущества недоступны простому программисту под ДОС. Поскольку для ДОС-а не пишут драйверов под новые видеокарты, нет единого доступного интерфейса для управления внутренними командами этих видеокарт. И поэтому приходится пользоваться стандартными методами и при помощи центрального процессора копировать наборы байт из одного места в памяти в другое. [COLOR=red] Для справки: 1. Пропускная способность шины AGP ,в режиме 8x, составляет 133*2фронта*4байта = 1064 Мб/сек. 2. Пропускная способность памяти типа DDR400(PC3200) составит 200*2*8 = 3200 Мб./сек. , но не реализуемо ( мешают подлые законы физики ), по этому на каждые 8 байт добавляется по 1 такту простоя в синхр. режиме на формирование сигналов RAS/CAS по одному на каждый и 1 такт на формир. сигнала REPLY от диспетчера памяти, далее добавим 2 такта на операцию чтения или записи ИТОГО: 5 тактов при доступе к разрозненным данным, что составит примерно 640 Мб/сек. Если использовать передачу блоков , то сетуация будет выглядеть несколько лучше ввиду использования потокового чтения/записи памяти по сигналу RAS, в этом случае скорость 3200 Мб/сек. теор. достижима. 3. Двойная буферизация предпологает - write_mem ~ ~ read_mem ~ write_video т.е. (3200 / 3) = 1066 P.S. Ну просто явное превосходство "гемор.." , ах простите двойной буфферизаии над прямой записью в вид. память. По поводу же сегментной орг. вид. памяти то ето проблема, но к счастью давно решенная , не нравится банки счелкать - юзай LFB. Ну, что до плавного перекл. страниц, то это не вопрос вообще. Для этого можно просто сместить (function of VESA ) адрес начала видео памяти. |
Сообщ.
#14
,
|
|
|
Дело даже не в пропускной способности, а в том, что уйма процессорного времени уходит на обработку того, что нужно выводить, как нужно выводить и т.д. Допустим простейшее масштабирование спрайта. Могу сказать с уверенностью на 99%, что эта функция реализована внутренним образом в видеокарте, задай только адрес текстуры и масштаб, и львиная доля нагрузки на ЦП пропадает. Кстати пропускная способность на данный момент в современных видеокартах ограничивается только возможностями шины данных, и уже есть давно AGP4, и PCI2, с более высокими показателями. Эти ограничения тем более заметны в 3д-приложениях, где ежекадрово приходится передавать большие массивы данных от карты в обычную память (допустим всё изображение, с Z-буфером в 64bpp).
Добавлено З.Ы. возвращаясь к масштабированию - уверен в реализации есть масштабирование с линейным, кубическим и т.д. сглаживанием (зависит от покаления карточки). Представь себе на секунду, что тебе нужно процом вращать и интерполировать бикубически спрайт размером с экран... а если их 20? |