OSDev

для всех
Текущее время: 29 мар 2024, 13:35

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
СообщениеДобавлено: 30 апр 2018, 19:33 

Зарегистрирован: 04 мар 2018, 21:34
Сообщения: 55
Добрый вечер! Я рисую задний буфер пока пользователь не видит, это в целом происходит быстро. По идее это делается чтобы пользователь не видел как мы рисуем, т.к. он смотрит на видео память. И затем я подменяю задний буфер и передний, кодом ниже.

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


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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 30 апр 2018, 22:12 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01 май 2018, 09:47 

Зарегистрирован: 04 мар 2018, 21:34
Сообщения: 55
В целом логика ясна. Спасибо!

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


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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01 май 2018, 12:19 

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB