Программирование графики и звука на ПК - Всего вопросов новичка, и их много! - PullRequest
1 голос
/ 09 июня 2010

Это не совсем вопрос программирования (или нет?), Но мне было интересно:

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

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

  1. Где-то есть зарезервированное пространство памяти, в котором достаточно места для кадра графического вывода на ваш монитор.IE: 800 x 600, 24-битный цветной режим == 800x600x3 = ~ 1,4 МБ памяти

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

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

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

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

a) Насколько близка приведенная выше догадка (три шага)?

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 09 июня 2010

a.

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

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

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

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

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

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

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

0 голосов
/ 14 июня 2010

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

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

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

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

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

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

...