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

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

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

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

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

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

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

dp/hdmi передают данные, кодировав в цифровом виде, но в мониторе уже есть буфер для их хранения.
Ответ написан
@Mercury13
Программист на «си с крестами» и не только
1. Инициирует видяха, и вообще поток данных для ЖК очень напоминает данные для ЭЛТ-монитора: между строчками пауза, между кадрами пауза побольше. Я это называю «виртуальная развёртка».

2. Цифровое буферизируется ВСЕГДА. Эра небуферизированного цифрового осталась где-то в первых телетайпах, у которых были раздельные команды CR и LF… просто чтобы телетайп успел вернуть каретку и прокрутить барабан. И то телетайп вынужден преобразовывать последовательный код в N постоянно и одновременно «горящих» битов, и на это нужен буфер по ширине кода — 5 битов или сколько там нужно.

Большинство мониторов хранит весь кадр, как минимум для работы всяких там ШИМов, овердрайвов и улучшайзеров, но желательно уж передавать данные из буфера на матрицу как можно быстрее.

3. Хорошо, поднимаем схему первого попавшегося монитора и смотрим. Большая часть монитора — это огромная микросхема производства PixelWorks, которая выполняет все эти штуки с видеопотоком — разбор протокола, апскейлинг, улучшайзинг, овердрайв, генерацию команд для ЖК-панели — аппаратно.

Где-то рядом находится самый обычный микроконтроллер с ПЗУ, который занимается чтением кнопок, инициализацией здоровенной микросхемы и вмешательством в её видеопоток, чтобы показывать экранное меню. Потому, кстати, в большинстве мониторов меню такое корявое — им занимается не могучая специализированная микросхема, а несчастный 32-битный микроконтроллер.

Я не настолько разбираюсь в электронике, но сумел идентифицировать схему подсветки (диодной), главную микросхему, микроконтроллер с ПЗУ, обвязку клавиатуры (сколько там кнопочек — шесть?) и блок питания — каждое на своём листе.
Ответ написан
@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% общего времени обновления кадра.
Ответ написан
Ваш ответ на вопрос

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

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