Что происходит во время изменения режима отображения?

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

Это может быть не так тривиально, потому что видеокарты настолько разные, но одно общее для всех:

  • Экран становится черным (понятно, поскольку сигнал выключен)
  • Требуется много секунд для возврата сигнала с новым режимом

и если он находится под D3D или GL:

  • Графическое устройство потеряно, и все объекты VRAM должны быть перезагружены, что делает изменение режима еще более длинным.

Может кто-то объяснить основную природу этого и, в частности, почему изменение режима отображения не является тривиальным перераспределением буфера и занимает такое "длинное" время?

Ответ 1

Единственное, что на самом деле меняется, - это настройки так называемого RAMDAC (цифрового аналогового конвертера, напрямую подключенного к видеопамяти), а сегодня с цифровыми соединениями он больше похож на RAMTX (передатчик DVI/HDMI/DisplayPort, подключенный к видеопамять). DOS графические программисты-ветераны, вероятно, помнят бои между RAMDAC, спецификацией и бедами одного собственного кода.

На самом деле не требуется секунд, пока сигнал не вернется. Это довольно быстрый процесс, но большинство устройств отображения тратят свое время на синхронизацию с новыми параметрами сигнала. На самом деле с хорошо написанными драйверами изменение происходит почти сразу, между вертикальными заготовками. Несколько лет назад, когда дисплеи были, errr, stupider и analogue, после изменения настроек видеорежима, можно было увидеть, что изображение становится неистовым на короткое время, пока дисплей не будет синхронизирован (возможно, я должен снять видеоизображение, в то время как У меня все еще есть оборудование, способное на это).

Поскольку то, что на самом деле происходит, - это просто изменение настроек RAMDAC, также не требуются потерянные данные, если основные параметры остаются неизменными: количество бит на пиксель, количество компонентов на пиксель и шаг пикселя. Фактически контексты OpenGL обычно не теряют свои данные при изменении видеорежима. Конечно, видимые макеты фреймбуфера меняются, но это происходит и при перемещении окна вокруг.

DirectX Graphics - это немного другая история. Существует эксклюзивный доступ к устройству и при переключении между полноэкранным режимом Direct3D и обычным рабочим столом все графические объекты меняются местами, поэтому причина, по которой DirectX Graphics настолько отстает при переключении с/на игру на рабочий стол Windows.

Если формат формата пикселей изменяется, он обычно требует полной повторной инициализации видимого фреймбуфера, но сегодня графические процессоры исключительно хороши в отображении гетерогенных форматов пикселей в целевой фреймбуфер, поэтому никаких задержек там не требуется.