На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
В этом разделе можно создавать темы, которые относятся к поколению 32-битных компиляторов.
Здесь решаются вопросы портирования кода из старого доброго Турбо Паскаля в FPC, TMT, VP, GPC компиляторы, а также особенностей программирования на них для Windows/Linux и других ОС.
Указывайте тип компилятора, его версию, а также платформу (Windows/Linux/..) компиляции, другими словами, Target.
Модераторы: volvo877
  
> "Быстрая" графика
    Какие есть способы сделать графику плавной (что бы при смене изображения не моргал экран)
    В TP, можно было переключать видеостраницы, есть ли подобные средства при использовании windows графических режимов.
    Тех. инфрмация:
    компилятор FPC,
    граф. библиотека: GraphiX (поддержка DirectX)

    Заранее спасибо за ответы!
      Этот метод одинаков для всех языков: двойная буферизация.
      Идея состоит в следующем - рисуем сначала не в видеопямять, а, например, в массив. И потом этом массив одной командой выводим на экран
        А переключение видеостраниц - это древний и абсолютно не оправдывающий себя метод. От его использования лучше всего избавиться и в TP.
          Не понимаю, почему способом 2-ой буферизации быстрее, чем сначало загнать пиксели в видеопамять и вывести на экран. Если считать все в массиве, то зачем нужны такие большие объемы видеопамяти, 1 мегабайта хватило бы?
          И как одной командой можно вывести значение массива на экран?
            Потому что видеопамять медленнее оперативной.
              Вот этого я не знал- даже и не задумывался, что она медленние!
              А как насчет вопрос 2 и 3?
                2. В современных видеокартах видеопамять используется для хранения текстур при 3d-построении. Под дос используя окно в A000 память работает медлено. А быстро она работает в самой видеокарте, из винды ей можно давать команды, которые она выполняет, работая с памятью, котрая наиболее близка к видеопроцессору (тобишь на плате видеокарты). Реализацией основного набора команд для видеокарт современного поколения занимаются драйвера видеокарт под ОС (например драйвера под винду). Над драйверами идёт надстройка к примеру в виде DirectDraw/3d, реализуя уже удобные для использования функции.
                3. Что значит значение массива? все элементы массива в текстовом виде? какого типа данные в массиве? Поясни что требуется
                  Что-то я запутался!!
                  Цитата
                  Этот метод одинаков для всех языков: двойная буферизация.
                  Идея состоит в следующем - рисуем сначала не в видеопямять, а, например, в массив. И потом этом массив одной командой выводим на экран

                  и
                  Цитата
                  В современных видеокартах видеопамять используется для хранения текстур при 3d-построении...А быстро она работает в самой видеокарте, из винды ей можно давать команды, которые она выполняет, работая с памятью, котрая наиболее близка к видеопроцессору

                  Непонимаю. Из первого утверждения следует , что быстрее работает в оперативной памяти- из 2-ого- в видеопамяти... :wacko:
                    небольшие рисунки можно рисовать во время обратного хода кадровой развертки.
                    На TP я это делал так :
                    ExpandedWrap disabled
                      while (port[$3da] and 8) = 0 do;
                            {собственно рисование}  
                      Цитата Newer @ 18.10.04, 10:54
                      Непонимаю. Из первого утверждения следует , что быстрее работает в оперативной памяти- из 2-ого- в видеопамяти... :wacko:

                      Нет, всё в порядке.

                      2-е утверждение означает, что задействуются "вшитые" команды видепроцессора, которые соответственно быстрее.
                        To FilosofНу этим я тоже полбзовался на БП- это Retrace;
                        Цитата
                        2-е утверждение означает, что задействуются "вшитые" команды видепроцессора, которые соответственно быстрее.

                        Ага..! Значит можно использовать 2-ую буферизацию и также видео память, управлять кот. можно с помощью спец команд процессора! Этими командами можно пользоваться с помощью OpenGl и DirectX/Draw???
                          Я уже описал. Не путай центральный процессор и процессор на видеокарте.
                          Вот смотри - у тебя на компе есть центральный процессор. Он считает и обрабатывает практически всю информацию, которая необходимо. Но есть ещё и видеокарта - на ней свой процессор, не такой мощный как центральный, но он оптимизирован для других задач. Он сделан для того, чтобы обрабатывать графические данные, и выводить их в видеопамять (а так же на экран). Центральный процессор только косвенно управляет, какие данные следует обрабатывать видеопроцессору, даёт ему общие команды. А эти комнады реализуются уже видеопроцессором на видеокарте, потому что он быстрее справляется и специально сделан для таких задач.
                          Говоря о видекарте я имею ввиду более или менее новые карты. Так вот для работы с видеопроцессором таких карт написаны драйвера для этих видеокарт. Они обобщают специфические особенности разных видеокарт и формируют из них общий стандарт для работы с графикой, чтобы не зависимо от карты одним и тем же кодом можно было заставить выполнять её нужные действия. Но драйвера реализуют очень мелкие команды (на подобе ассемблерных). И ими пользоваться не удобно. ПОэтому над драйверами в виндовсе есть графические надстройки вроде Open-GL и DirectX. Уже они формируют процедуры и функции, которыми удобно пользоваться программисту.

                          К сожалению все эти преимущества недоступны простому программисту под ДОС. Поскольку для ДОС-а не пишут драйверов под новые видеокарты, нет единого доступного интерфейса для управления внутренними командами этих видеокарт. И поэтому приходится пользоваться стандартными методами и при помощи центрального процессора копировать наборы байт из одного места в памяти в другое.
                            Цитата 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 ) адрес начала видео памяти.
                              Дело даже не в пропускной способности, а в том, что уйма процессорного времени уходит на обработку того, что нужно выводить, как нужно выводить и т.д. Допустим простейшее масштабирование спрайта. Могу сказать с уверенностью на 99%, что эта функция реализована внутренним образом в видеокарте, задай только адрес текстуры и масштаб, и львиная доля нагрузки на ЦП пропадает. Кстати пропускная способность на данный момент в современных видеокартах ограничивается только возможностями шины данных, и уже есть давно AGP4, и PCI2, с более высокими показателями. Эти ограничения тем более заметны в 3д-приложениях, где ежекадрово приходится передавать большие массивы данных от карты в обычную память (допустим всё изображение, с Z-буфером в 64bpp).

                              Добавлено
                              З.Ы. возвращаясь к масштабированию - уверен в реализации есть масштабирование с линейным, кубическим и т.д. сглаживанием (зависит от покаления карточки). Представь себе на секунду, что тебе нужно процом вращать и интерполировать бикубически спрайт размером с экран... а если их 20?
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0839 ]   [ 16 queries used ]   [ Generated: 19.04.24, 05:20 GMT ]