Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > особенности програмирования графики


Автор: oleg1973 6.4.2004, 22:00
ddraw
мне стало интересно как будет быстрее работать с бекбуфером в видео памяти или со своим в оперативке , потом копировать в бекбуф и флипать в primarysurf?
в теории что получаем
при обновлении картинки на экране нада уложится в некий промежуток Х обратного хода луча
но если к примеру мы слишком долго чтото рисовали в бекбуфере то при flip директ драв как умная система будет ждать обратного хода луча
таким образом пролетаем на 1 кадр к примеру и плюс ко всему держать в lock бекбуфер тоже не есть хорошо
если мы имеем свой буф в оперативке
рисуем там скока влезет
по окончанию рисования делаем lock бекбуфера в видеопамяти , копируем туда свой буф
и flip
в данном варианте всегда попадем в нужный кадр smile.gif
ддрав не будет терять сурфейс (кто знает тот поймет)
тоесть пока мы рисуем там себе он свободен smile.gif
скорость пересылки данных я так похимичил
на асме 2 такта на 4 байта (если справочник не врет smile.gif )

кароче поправте если не прав smile.gif

Автор: p0s0l 6.4.2004, 23:48
Ну дак ждем результатов замеров FPS одного и тоге же теста, реализованного сказанными двумя способами...

Ну я посчитал так:
1280x1024x32 ~ 5 Mb, movsd такого объёма у меня затягивается на 20 мс.
Т.е. если обеспечить 50 FPS, то всё 100% время проца уйдет на пересылку данных...
Правда, следует сказать, что я делал пересылку из ОП в ОП, а не в back-буфер. Но даже если и будет быстрее раза в 2-3, то всё равно, 30-50% времени проца будет сжираться перекидыванием байтиков (для FPS=50).

Автор: oleg1973 6.4.2004, 23:58
интересно за сколько бекбуф видео карты перекидывается?
а как ты замерял скорость ?

Автор: p0s0l 7.4.2004, 00:10
Цитата
интересно за сколько бекбуф видео карты перекидывается?

Проверь, долго ли тебе это сделать ? Чем гадать-то. По-моему, вот у меня DDR400 на видях, а память DDR какая-то одна из первых. Думаю при перекидывании в бэкбуффер было бы раза в 2 быстрее, но это максимум...

Замерял на Delphi:
Код

size := 1280*1024*32 div 8;
QueryPefromanceFrequency(freq);
QueryPerfomanceCounter(tim1);
Move(buf1^, buf2^, size);
QueryPerfomanceCounter(tim2);
time := ((tim2 - tim1) * 1000) div freq; - будет в милисекундах

Если боишься за Move - то зря, он там умный, вначале делит размер на 4 и делает movsd, остаток уже добивает movsb, так что потери тут микроскопические...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)