Начал изучать DirectDraw. Столкнулся с тем как на разных видеокартах происходит Flip().
Вывожу 1 раз на back surface картинку. Дальше Flip() 1 раз в секунду.
На S3 Trio64, мигание картинки не происходит, т.е. содержимое первичной и задней поверхности одинаковое — получается что флип делает копирование из заднего буфера на первичную поверхность.
На NVIDIA Vanta/Vanta LT, мигание есть, т.е. содержимое содержимое первичной и задней поверхности разное — получается что флип НЕ делает копирование, а только меняет адреса.
Вопрос? Как определить будет ли флип делать копирование или менять адреса?
Re: DirectDraw->Flip(), флип или таки копирование?
Здравствуйте, DigitalTaurus, Вы писали:
DT>Начал изучать DirectDraw. Столкнулся с тем как на разных видеокартах происходит Flip(). DT>Вывожу 1 раз на back surface картинку. Дальше Flip() 1 раз в секунду.
DT>На S3 Trio64, мигание картинки не происходит, т.е. содержимое первичной и задней поверхности одинаковое — получается что флип делает копирование из заднего буфера на первичную поверхность. DT>На NVIDIA Vanta/Vanta LT, мигание есть, т.е. содержимое содержимое первичной и задней поверхности разное — получается что флип НЕ делает копирование, а только меняет адреса. DT>Вопрос? Как определить будет ли флип делать копирование или менять адреса?
Для более точного ответа в письме маловато информации.
Насколько я помню, в DirectDraw7 Flip() всегда меняет адрес. Более того,
этот вызов принудительно синхронизирован с кадровым прерыванием.
Вообще-то мигать ничего не должно. Тем не менее, картинка может мигать
по самым разным причинам . В данном случае скорее всего виноват
драйвер NVIDIA. В угоду скорости ребята всегда создают цепочку не меньше
чем из ДВУХ back-буферов (Flipping Surfaces) независимо от пожеланий
программиста. В этом можно убедиться — на картах NVIDIA время возврата
из Flip() свободно плавает относительно кадрового прерывания.
С приветом,
nkaipov
Re: DirectDraw->Flip(), флип или таки копирование?
Здравствуйте, DigitalTaurus, Вы писали:
DT>Вопрос? Как определить будет ли флип делать копирование или менять адреса?
Средствами DX — никак. Да и факт моргания картинки еще не говорит о том, что происходит копирование — запросто может отсутствовать синхронизация с кадровой разверткой.
Re: DirectDraw->Flip(), флип или таки копирование?
Здравствуйте, PatlatiY_Losj, Вы писали:
PL>Я тож столкнулся с проблемой моргания Флипа, и поэтому просто заместо него повесил FastBlt из заднего буфера в первичный
У меня эта проблема возникла когда я решил оптимизировать вывод — выводить фон на весь экран только один раз, а затем обновлять только изменившиеся области. Но так не получилось, приходится задний буфер каждый раз стирать и рисовать фон по новой. Не получилось потому что на одной видео карте идет копирование заднего буфера на первичный, на другой "чистый" флип. Получается чтобы оптимизировать вывод нужно помнить состояние экрана два шага назад в случае "чистого" флипа и шаг назад в случае копирования.
А в случае FastBlt какой бы она быстрой ни была будут моргания в любом случае, поэтому все же флип предпочтительнее.
Вопрос к геймдевелоперским гуру: как вы поступаете с прорисовкой нового кадра, неужели нет возможности обновлять только изменившиеся части, а не только стирать и перерисовывать полностью новый экран, чтобы работало на всех видеокартах?
P.S. Сравнил производительность Starcraft'a со своей программой, они похоже каждый раз перерисовывают полностью новый кадр, но это имхо.
Re[3]: DirectDraw->Flip(), флип или таки копирование?
Здравствуйте, DigitalTaurus, Вы писали:
DT>Вопрос к геймдевелоперским гуру: DT>как вы поступаете с прорисовкой нового кадра, неужели нет возможности обновлять только изменившиеся части, а не только стирать и перерисовывать полностью новый экран, чтобы работало на всех видеокартах?
Либо рисуй все заново в каждом кадре (у меня при тестах на P-166/S3 Trio 1MB VRAM получалось 30 FPS)...
Либо делай еще один Offscreen Surface (создавать сразу за Primary, чтоб гарантировано в видеопамять попал, если ее хватит, конечно) его и править и каждый раз Flip с него делать. Кстати, если его сделать с BackBuffer'ом — можно вывод сделать четко по таймеру, а рисовать когда необходимо... но скорее всего самым быстрым будет либо полная перерисовка либо один (!) offscreen surface, на котором прорисовываются изменения и Flip'аются на BackBuffer Primary Surface'а
silent
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))