Программирование графики и звука на ПК - Общие вопросы о новичке и многие из них!

Это не точно конкретно вопрос о программировании (или это?), но я задавался вопросом:

Как графика и звук обрабатываются из кода и вывода ПК?

Мое предположение для графики:

  1. Существует некоторое зарезервированное пространство памяти где-нибудь, которое содержит точно достаточно места для кадра вывода графических данных для Вашего монитора. IE: 800 x 600, цветовой режим на 24 бита == 800x600x3 = ~1.4MB пространство памяти

  2. Между каждым обновлением программа пишет видеоданные в это пространство. Это действие завершается перед обновлением монитора. Примите простую 2D игру: графические данные хранятся в машинном коде как много байтов, представляющих значения цвета. В зависимости от того, что запущенная программа сообщает ПК, процессор считывает соответствующие данные и пишет это в пространство памяти.

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

Все это, конечно, происходит сумасшедшее быстрое, и повторяет x времена секунда, x быть частотой обновления монитора. Я упростил свое собственное вероятно-неправильное объяснение путем предотвращения разговора о двойной буферизации и т.д.

Вот мои вопросы:

a) Как близко вышеупомянутое предположение (три шага)?

b) Как можно было включить графику в чистый код C++? Я принимаю практическую вещь, которую все делают, пользуются графической библиотекой (SDL, OpenGL, и т.д.), но, например, как эти библиотеки выполняют то, что они делают? Был бы ручное включение графики в чистом коде C++ (скажите, 2D злость), включите создание двухмерной антенной решетки битовых значений (или трехмерный для включения нескольких значений RGB на пиксель)? Это то, как это было бы сделано waaay назад в день?

c) Кроме того, продолжение сверху, сделайте библиотеки, такие как SDL и т.д., что битовые массивы использования, фактические просто, встраивают растровые/и т.д. файлы в машинный код исполняемого файла и используют их, как будто они были сборкой в том же вопросе, упомянул выше рассматриваемый b?

d) На моем гипотетическом шаге 3 выше, там какие-либо включенные регистры? Как, Вы могли записать, что некоторый байт оценивает некоторому регистру для вывода единственного цвета одного байта на экране? Или это - просто выделенное пространство памяти (=RAM) + аппаратное взаимодействие?

e) Наконец, как все это сделано для звука? (Я понятия не имею :))

1
задан Russel 9 June 2010 в 05:11
поделиться

2 ответа

а.

  1. Так было давно, но не так давно. Большая часть оборудования будет по-прежнему поддерживать этот тип конфигурации, но в основном в качестве запасного варианта - на самом деле они не предназначены для работы.Теперь у большинства из них есть блок памяти на видеокарте, который также назначен ЦП для адресации по шине PCI / AGP / PCI-E. Однако размер этого блока более или менее не зависит от того, что отображается на экране.

  2. Опять же, одно время так в основном работало, но теперь это уже не так.

  3. В основном верно.

б. OpenGL обычно состоит из нескольких частей - базовой библиотеки, которая является частью ОС, и драйвера, поставляемого поставщиком графического чипсета (или, возможно, карты). Хотя точное распределение трудозатрат между ЦП и ГП несколько различается (между поставщиками, с течением времени в рамках продуктов от одного поставщика и т. Д.) SDL построен на общей идее простого буфера кадра, как вы описали.

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

г. Здесь задействовано довольно много регистров, хотя основные поставщики графических чипсетов (ATI / AMD и nVidia), как правило, держат свою документацию на уровне регистров в более или менее секретной форме (хотя это могло измениться - разработчики с открытым исходным кодом постоянно требуют документации. , а не только драйверы с закрытым исходным кодом). Большинство аппаратных средств имеет такие возможности, как выделенное рисование линий, где вы можете поместить (например) параметры линии в указанные регистры, и оно будет рисовать указанную вами линию. Точные детали различаются широко , хотя ...

e. Извините, но это уже становится длинным, и звук покрывает довольно большую площадь ...

2
ответ дан 2 September 2019 в 23:56
поделиться

Что касается графики, у Джерри Коффина есть довольно хороший ответ.

Звук фактически обрабатывается так же, как ваше (OP) описание того, как обрабатывается графика. На самом базовом уровне у вас есть «буфер» (некоторая память, где-то).

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

Для звука "качества компакт-диска" у вас есть 44100 значений в секунду ("частота дискретизации" 44,1 кГц).

Немного отстает от позиции записи, у вас есть аудиоподсистема, считывающая из позиции чтения в буфере.

Эта позиция чтения будет немного отставать от позиции записи. Расстояние позади называется задержкой. Большее расстояние дает большую задержку, но также помогает избежать случая, когда позиция чтения догоняет позицию записи, оставляя звуковому устройству нечего на самом деле играть!

0
ответ дан 2 September 2019 в 23:56
поделиться
Другие вопросы по тегам:

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