OSDev
http://osdev.ru/

Замена буферов при двойной буферизации
http://osdev.ru/viewtopic.php?f=5&t=2327
Страница 1 из 1

Автор:  grenders22 [ 30 апр 2018, 19:33 ]
Заголовок сообщения:  Замена буферов при двойной буферизации

Добрый вечер! Я рисую задний буфер пока пользователь не видит, это в целом происходит быстро. По идее это делается чтобы пользователь не видел как мы рисуем, т.к. он смотрит на видео память. И затем я подменяю задний буфер и передний, кодом ниже.

Код:
memcpy(screen, system.framebuffer, screen_height * screen_pitch);


Но не смотря на это я вижу как происходит изменение, т.е. глаз успевает уловить как сверху вниз происходит изменение. Как ускорить этот процесс? Сто раз поднимал эту тему, но никак не могу добить.

Прочитал про вертикальную синхронизацию, действительно ли она помогает избавиться от мерцаний?

PS так же как вариант заменять не весь буфер, а нужный кусок, но из-за пустот между строками, обновлять приходилось построчно, и это еще хуже)

Автор:  SII [ 30 апр 2018, 22:12 ]
Заголовок сообщения:  Re: Замена буферов при двойной буферизации

Если упрощённо, смена буферов технически производится путём записи начального адреса буфера в нужные регистры видеоконтроллера -- т.е. происходит физическое переключение вывода на дисплей с одного участка памяти на другой, а не копирование подготовленной картинки из одного места в другое. И передний/задний буферы -- это как раз буфер, который физически отображается на экране в данный момент и другой буфер, который сейчас не отображается, но на который произойдёт переключение для отображения, и тогда он станет передним (а задним станет предыдущий передний).

Автор:  grenders22 [ 01 май 2018, 09:47 ]
Заголовок сообщения:  Re: Замена буферов при двойной буферизации

В целом логика ясна. Спасибо!

Не понятно лишь то, как происходит передача с одного участка на другой.
SII писал(а):
т.е. происходит физическое переключение вывода на дисплей с одного участка памяти на другой


Код:
typedef struct mode_info_block {
/*...*/
  uint32_t physbase;
/*...*/
}mode_info_t;

В структуре VESA вернул первый байт видео буфера, подменить этот первый байт (если не ошибаюсь) нельзя, получается мне что-то с буфером (под который я сам место выделил) надо сделать? Первый вариант звучит реалистичнее, но что-то я не вижу возможности изменить это значение.

Автор:  Himik [ 01 май 2018, 12:19 ]
Заголовок сообщения:  Re: Замена буферов при двойной буферизации

Смотрю Владимир Кулаков "Программирование на аппаратном уровне"...
В информационном блоке по смещению 1Dh находится байт - число видеостраниц.
По смещению 2Ch DWORD - указатель на начало заэкранной памяти, тоесть на начало второй видеостраницы.
По смещению 35h байт - количество видеостраниц в линейном режиме.
То что надо - функция 4F07h - установка отображаемой координаты левого верхнего угла экрана,
BL = 80h, BH = 0
CX = смещение пикселей по X
DX = смещение пикселей по Y

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/