Задать вопрос
@krv2k

Процесс вывода кадра из Front buffer на матрицу монитора. Как это работает?

До того момента, как кадр попадет в Front buffer, все более-менее понятно, а потом я запутался.
Для простоты рассматриваем ситуацию, когда нет никаких синхронизаций и прочих улучшайзеров. Также рассматриваем только более-менее современные технологии (никаких ЭЛТ-мониторов и VGA).

Вопросы:
1) Кто инициирует передачу кадра? Драйвер отправляет построчно пакетами кадр или монитор запрашивает определенную строку из Front buffer?
2) Изображение сразу выводится на матрицу из кабеля или в мониторе есть какие-то буферы? Если есть, то какие и как через них проходит изображение?
3) Какие участники процесса есть в мониторе и как они работают? Например, в компьютере это движок игры, графический API, драйвер видеокарты, видеокарта.

В нете много противоречивой информации, не смог найти где все это нормально описано.
  • Вопрос задан
  • 195 просмотров
Подписаться 2 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 3
@rPman
VGA, монитор не хранит ничего, в момент установки видеоразрешения частоты монитора и видеокарты синхронизируются, и монитор ожидает по vga кабелю значение текущего rgb пиксела, в зависимости от типа видеорежима, interlaced через строку или по очереди каждая строка, пикселы ожидаются слева направо снизу вверх (или сверху вниз уже не принципиально), видеорежим подразумевает не только время на кадр, но и к примеру сколько времени нужно ожидать между строками, как кодируется цвет (монохромный или цветной) и т.п..

Когда то очень давно были даже хитрые выкрутасы, когда процессор напрямую управляя rgb цветами, позволял выдавать изображение, лучше качеством чем в принципе позволяла видеокарта (из за маленького видеобуфера старые видеокарты не умели попиксельные картинки, но умели текстовые, так как текст требует меньше памяти)

Современные lcd панели, или при использовании vga-hdmi переходника, симулируют работу crt монитора, для чего вынуждены хранить свой буфер текущего кадра, по техническим причинам lcd панель меняет значение пиксела тысячи раз в секунду (они так ШИМ-ом яркость меняют), для этого буфер и нужен.

dp/hdmi передают данные, кодировав в цифровом виде, но в мониторе уже есть буфер для их хранения.
Ответ написан
@alexalexes
В самом простейшем случае видеокарту, интерфейс передачи видео и монитор нужно рассматривать так:
1) видеокарта - отдельный компьютер.
2) интерфейс передачи данных - как многоуровневая модель последовательного интерфейса, как например, модель OSI для сетей Ethernet.
3) монитор - отдельный компьютер.
В промежутке между 1-2 будет решаться проблема, как из данных буфера кадра, данных буфера звука (не забывайте, что у вас есть логика вывода звука на борту карточки), общих данных шины PCI-E (еще можно данные USB, SATA, NVME обернуть в видео интерфейс) сформировать сообщение для передачи через интерфейс 2 по определенному протоколу. Сообщение нужно будет из прикладного уровня преобразовать последовательно в физический уровень. Только после этого конечное состояние сообщения - набор датакадров можно физически передать через кабель.
Количество уровней у протокола интерфейса будет зависеть от того, насколько может быть сложна топология и маршрутизация устройств. Если кабель соединяется от порта и до порта и не предполагает хабов, то протокол передачи будет иметь 3 уровня абстракции, если есть хабы и сложная маршрутизация - то до 7 уровней и более.

В промежутке между 2-3 решается обратная задача - как получить сообщение из кадров физического уровня. И раскидать данные на разные устройства монитора. Видео данные отправятся на контроллер матрицы, аудио на контроллер вывода звука, а прочие данные в хаб - могут быть выведены любые порты на мониторе - USB, HDMI, DP и др.
Ответ написан
@krv2k Автор вопроса
Попытался собрать в кучу инфу, которую нашел, но, возможно, все неправильно понимаю.

Что происходит после того, как сигнал пришел на монитор:
1) Сначала данные помещаются в Input buffer (там помещается одна строка).
2) Дальше развилка
- Если требуется масштабирование, то скалер переносит данные из Input buffer в Scaler buffer. После обработки строки скалером, ее переносит в Frame buffer видеопроцессор монитора.
- Если масштабирование не требуется (пришла картинка с родным разрешением), то видеопроцессор монитора переносит данные из Input buffer сразу в Frame buffer.
3) Если требуется пост-обработка (а обычно требуется), например, корректировка яркости, контрастности и т.п., то они проходят через Line buffer:
- Этой работой занимаются специализированные схемы обработки изображения (например, цифро-аналоговые преобразователи — DAC).
- Они помещают строку из Frame buffer в Line buffer
- Обрабатывают эту строку
- Возвращают назад в Frame buffer
4) Все, кадр готов к выводу на матрицу.

Непосредственно, вывод на матрицу:
1) Контроллер по своему внутреннему таймеру определяет, что нужно начинать процесс вывода кадра.
2) Контроллер построчно выводит кадр на экран (Scan out):
- Из Frame buffer берется одна строка (ScanLine).
- Эта строка выводится на матрицу.
3) Далее следует этап VBLANK, длится ~5% общего времени обновления кадра.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы