· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ZEN —› Как ускорить вывод графики?

Посл.отвђт Сообщенiе


Дата: Апр 11, 2004 00:32:14

Обнаружил досадную для меня вещь: когда я делал вывод на экран прямой записью в видеобуфер,то увидел, что скорость обновления экрана довольно маленькая (где-то на глаз 1/4 секунды на кадр). Раньше как-то на это не обращал внимания, но потом подумал: "ведь я же на этой видеокарте вполне нормально фильмы смотрю, а тут такие тормоза, казалось бы моя программа должна работать еще быстрее" (видеокарта GeForce FX5200 64Mb). Вот у меня и возник вопрос: как сделать быстрый вывод графики? Я предполагаю что тут что то похожее на адаптер EGA, в котором можно было сразу рисовать по 8 точек одного цвета. Вот только не смог найти нигде описания по AGP-шным картам. Кто разбирается в этом, помогите пожалуйста.


Дата: Апр 11, 2004 10:26:05 · Поправил: S_T_A_S_

Icebp

Под видеобуфером что понимаете?
Если первичную поверхность экрана, то быстее будет такой способ:
Создается внеэкранная поверхность в обычной памяти, работу с ней можно неплохо оптимизировать.
Когда кадр постоен, копируем его аппаратным блиттером на первичную поверхность.
Или во вторичный буфер в видеопамяти, а затем flip (для full screen может быть полезно)
А напрямую писать на первичную поверхность экрана очень медленно, а если еще и читать оттуда :(

Да, еще можно потерять лишние кадры при неправильной синхронизации
(в 2 раза умньшится скорость)


Дата: Апр 13, 2004 08:33:08

S_T_A_S_

Я пишу в видеобуфер по адресам с 0a0000h по 0affffh, а затем переключаю банки видеопамяти. Так вот, если я пишу даже один цвет примерно так:
mov ax,0a000h
mov es,ax
mov al,2
xor di,di
vb_cycl: mov [es:di],al
inc di
or di,di
jnz vb_cycl
то у меня получается слишком малая скорость. Расскажите поподробнее что такое аппаратный блиттер и как его делать. Также я не знаю что такое первичная поверхность экрана. Просто раньше я делал примерно так как показано выше и скорость меня в принципе устраивала, теперь же я понял, что у меня есть пробел в знаниях насчет вывода графики. Просветите пожалуйста.


Дата: Апр 14, 2004 03:33:55

Icebp
Тебе под DOS?
Словами (двойными) писать не пробовал.


Дата: Апр 14, 2004 17:34:00 · Поправил: Sm_Andrei

Icebp
Попробуй поизучай защищенный режим - 32-битный режим.
Когда я стал работать с графикой в защищенном режиме,
производительность возросла где-то в 6-7 раз, а с
использованием 3D now!!!, MMX или чего там у тебя есть,
вообще летать все будет.


Дата: Апр 14, 2004 18:14:48

Когда я писал двойными словами, то скорость была еще маленькая. Действитено, попробую-ка я писать в видеобуфер из MMX (movq [es:di],mm0 например) регистров или из SSE. Вот у меня еще возникла мысль: если я буду писать в видеобуфер минуя кеш (movntq кажется инструкция называется), то сильно ли у меня возрастет скорость или нет? Не пойму вот почему в защищенном режиме скорость растет в 6-7 раз, казалось бы она либо не поменяется либо понизится. Вот кстати раз уж речь зашла о защищенном режиме: может можно обойтись без переключения банков памяти, может есть область памяти где то вверху адресного пространства например в несколько мегабайт, записывая в которую можно выводить на экран точки и не переключать банки видеопамяти. Если так, то я все-таки буду писать в эту область памяти из unreal mode. Это же ведь гораздо удобнее по-моему. Вот еще вопрос: например нарисовал я на экране к примеру треугольник и мне надо его повернуть например на 17 градусов. Могу ли я это сделать не переписывая в видеопамять изображение нового треугольника, а сделав что-нибудь хитрое с регистрами видеокарты?


Дата: Апр 14, 2004 21:49:12

Вот прочитал, сделал несколько выводов, по собственному опыту, тоже страдал одно время этим.
1. если работать на небольших разрешениях (да и на больших тоже) для создания более реалистичного и динамичного изображения при присутствии 1 видеостраницы памяти делали так: строили изображение отдельно где-то в обычной оперативе, а лишь затем его _полностью_ переносили в видеобуфер, те до того, как кадр не будет полностью построен - в адрес видеобуфера ничего не пишется, проще стало, когда появилась возможность иметь сразу несколько видеостраниц, ну о этом говорилось уже выше, кстати первичная поверхность - есть видеостраница отображенная на экране в данный момент.
2. По поводу unreal mode и всего того, что говорилось о переключении банков, да именно так и делается, в защищеном или унреале пишешь в видеопамять без переключений банков, если хочешь могу даже исходник откопать был где-то на unreal пиши на dima@n23.ftr.ru.
3. А теперь забудь о том, что я говорил выше, не парь мозги и пиши для DirectX, там тебе и будет аппаратный блитер.


Дата: Апр 14, 2004 22:22:23

Mad_C
Я послал тебе письмо, но похоже оно не дошло, поэтому дублирую здесь. Вышли мне, пожалуйста, исходник по мейлу: icebp@hotmail.ru


Дата: Апр 14, 2004 22:55:47

Мне кажется у тебя что-то с ящиком мой сервак вернул мое письмо обратно со страшной руганью :)))
A message that you sent could not be delivered to all of its recipients. The
following address(es) failed:

icebp@hotmail.ru:
SMTP error from remote mailer after RCPT TO:
<icebp@hotmail.ru>:
host mail.hotmail.ru [212.48.140.156]:
553 Your mail rejected. Please, forward this error message to abuse@nm.ru (212.96.97.73) 7

В общем, если с мылом так и не разбирешься, исходник положу сюда завтра вечером, он на работе у меня, если раньше разбирешься то утром могу дать, попробуй письмо еще на mad_c@bk.ru отправь


Дата: Апр 15, 2004 07:15:26 · Поправил: Sm_Andrei

Icebp
почему в защищенном режиме скорость растет в 6-7 раз

Именно переключение банков капитально тормозит работу с
графикой - постоянное отслеживание границ банков медлит
вывод примитивов. Особенно это сказывалось, когда
выводил окружности(кажется методом Брезенхейма), это было
просто убийственно. В защищенном режиме начал выводить
в оперативную память, только это увеличило производительность
в несколько раз.
И чем больше разрешение, тем это заметнее.
Только скорость вывода закрашенного прямоугольника
изменилось всего лишь в 1,5 раза.
К тому же с некоторыми операциями деления, при выводе
примитивов, было тяжело работать на 16-битных регистрах.


Дата: Апр 15, 2004 19:15:34

Icebp
Лови обещаный исходник на unreal mode там я кажется бмп вывожу, если память не изменяет 800х600х16b (эххх, давно это было), но суть не в этом, суть в том, как я получаю адрес вывода из vesa, вообще советую почитать справочник по ее функциям.
P.S Sm_Andrei прав, но лучше учи не защищенный режим, хотя он тож не помешает, но для скажем написания своей ОС, а вот для графики советую всеж ориентироваться на защищенный режим под win32, что гораздо проще и менее гемморойно, тем более когда там есть directx или opengl, без них твои программы все также останутся тормазнутыми, не используя аппаратные ускорители видюх... с таким же успехом без директа можешь смело выкинуть свой GeForce FX5200 64Mb, и поставить 4 метровую s3 -результат по скорости будет приблизительно одинаков...
P.P.S. на код не матюкайся, когда его писал было мне 16 лет и я только учил тасм после спектрума :)))


_901687979__VESA.ASM


Дата: Апр 15, 2004 19:18:44

[i][/i]
если решишься компилить - это должен быть сом-файл!


Дата: Апр 17, 2004 09:42:20

Mad_C
Спасибо большое за исходник! А что примерно из себя представляют аппаратные ускорители видюх ?


Дата: Апр 18, 2004 22:05:49

Пардон, немножко не так выразился - "... не используя аппаратное ускорение видюх", хотел сказать :)) а это есть "зашитые" в апаратуру видеокарт стандартные методы всяческих часто используемых в графике функций, тобишь например 3d-конвеер, затенение, удаление скрытых поверхностей, антиалиасинг и тд, те как-раз те функции, которые очень сильно напрягают при расчете процик


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.122