Почему у нас есть графические фреймворки, такие как OpenGL и DirectX, когда игры могут просто рисовать пиксели напрямую?

16

Игры и другие графически насыщенные приложения используют такие платформы, как OpenGL и DirectX. Также им требуются такие функции, как пиксельный шейдер и DX12.

Но зачем нам все эти фреймворки и функции GPU, когда мы можем просто рисовать все пиксель за пикселем?

Во-первых, игру нужно будет компилировать так, чтобы она рисовалась попиксельно. Это может сделать исполняемый файл большим, но будет ли он быстрее и работать на любом 32-битном цветном графическом процессоре (даже старом)?

Я знаю, что первые 3D-игры были нарисованы попиксельно, но почему они не делают это сейчас?

Суичи Дога
источник
В целом, выполнение одной операции над многими вещами более эффективно и проще для размышления, чем выполнение каждой операции в отдельности.
user541686
2
Потому что каждая игра должна быть переписана для каждой видеокарты. Если они не использовали видеокарту, но тогда они будут медленными.
user253751
Я думаю, что GPU-компании должны создавать свои собственные драйверы DirectX
Suici Doga
1
«Но зачем нам все эти фреймворки и функции графического процессора, когда мы можем просто рисовать все пиксель за пикселем?» Вот как это было сделано в старые добрые времена. Wolfenstein 3D, Doom, Duke Nukem 3D, Quake и большинство других игр конца 90-х годов использовали чисто программный рендеринг (Quake предлагал рендерер OpenGL в качестве опции).
el.pescado
1
@MatthewRock Ты не помогаешь. Вы, конечно, можете связать ОС с игрой внутри докер-контейнера и распространять его. Таким образом, пользователю не нужно устанавливать библиотечные зависимости для своего дистрибутива.
Навин

Ответы:

23

Скорость является наиболее распространенной причиной, почему это не сделано. Фактически, вы можете делать то, что предлагаете, если вы создаете свою собственную операционную систему, она будет очень медленной по архитектурным причинам. Так что предположение, что это быстрее, немного ошибочно. Даже если это будет быстрее, это будет менее эффективно с точки зрения разработки (например, увеличение скорости на 1% в 10 раз).

Копирование данных с ЦП на видеокарту является относительно медленной операцией. Чем меньше вы копируете, тем выше может быть скорость обновления. Поэтому в идеале вы должны располагать большей частью данных на своем графическом процессоре и обновлять только небольшие фрагменты данных. Существует различие между копированием более 320x200 пикселей по сравнению с 1920x1200 или более. Количество пикселей, которые нужно обновить, увеличивается в квадрате по мере увеличения сторон.

Пример: дешевле сказать GPU перемещать изображение на 10 пикселей вправо, чем копировать пиксели вручную в видеопамять в разных местах.

Почему вы должны пройти через API? Просто потому, что это не твоя система. Операционная система не может позволить вам делать все, что вы хотите по соображениям безопасности. Во-вторых, поскольку операционной системе необходимо абстрагировать оборудование, даже ОС взаимодействует с драйвером через какую-то абстрактную систему, API, если хотите.

На самом деле, я бы оценил вероятность того, что ваша система будет быстрее, если вы просто сделаете всю работу самостоятельно, близкой к нулю. Это немного похоже на сравнение C и сборки. Конечно, вы можете писать на ассемблере, но в наши дни компиляторы довольно умны и оптимизируют все лучше и лучше. Трудно быть лучше вручную, даже если вы можете, ваша производительность снизится до предела.

PS: API не делает это обновление невозможным, как это делали старые игры. Это просто неэффективно, вот и все. Не из-за разума API, а потому что это неэффективный период.

PPS: Вот почему они выкатывают Vulkan.

joojaa
источник
6
See the number of pixels you need to update grows exponetially when the sides grow.Квадратично, я думаю.
Ктулху
«Копирование данных с ЦП на видеокарту является относительно медленной операцией». Это правда, но не имеет значения. Копирование нескольких миллионов пикселей со скоростью 60 кадров в секунду легко достижимо даже на скромных каналах PCI-E (для этого потребуется всего несколько сотен мегабайт в секунду).
Coxy
2
@ pjc50 Это не так, но не совсем верно. Графический процессор специализирован для параллельного запуска одной программы (обычно шейдера) на большом количестве данных. Таким образом, вам нужно выполнить те же операции с большим количеством данных, чтобы фактически использовать вычислительную мощность графического процессора. Если ваша программа этого не делает, вам лучше запустить программу на процессоре.
Неро
2
Икс22Икс
1
Вы говорите о копировании и перемещении, но что более важно, так это фактическое создание изображений. Вы должны определить, какой объект будет виден в какой момент, как он будет освещен, каковы будут последствия дыма и т. Д. И т. Д. Графические процессоры высоко оптимизированы для быстрого и параллельного выполнения этих операций. API-интерфейсы упрощают выражение общих операций.
IMil
15

работать на любом 32-битном цветном графическом процессоре (даже старом)?

Немного истории здесь: так создавались игры на ПК, пока графические ускорители не стали доступны в середине 90-х годов. Это действительно работало на всех аппаратных средствах, потому что аппаратные средства делали мало.

Графический ускоритель позволяет рисовать пиксели значительно быстрее, чем процессор, используя специальное оборудование и параллелизм. Ускоритель содержит ряд процессорных ядер. Настольный ПК будет иметь от 1 до 8 ядер в зависимости от возраста. Моя видеокарта GTX970Ti имеет 1664 (одна тысяча шестьсот шестьдесят четыре!) Ядер. Это явно превосходит ПК по сырой скорости на долгом пути.

Однако ускорители не стандартизированы и часто включают в себя странные приемы компьютерной архитектуры для достижения своей скорости. Чтобы написать игру, которая не настроена под конкретную марку и модель карты, должен существовать API. И именно для этого используются DirectX, GL и шейдерные языки. На самом деле, написание шейдера является самая близкая вещь к написанию программы, которая рисует пиксели напрямую - просто карта будет работать для вас тысячами копий этой программы параллельно, по одному на пиксель.

pjc50
источник
APU моего ноутбука имеет 256 шейдерных ядер с частотой 686 МГц, а у моего планшета - 192.
Suici Doga
Эй, у Titan X 5760 ядер.
Даниэль
@Daniel Существуют ли игры, в которых у Titan X сверхскоростная скорость <30 кадров в секунду. Titan X очень мощный
Suici Doga
Ммм, один из них, возможно: maximumpc.com/10-most-graphically-demanding-pc-games
Даниэль
@Daniel Разработчикам этих игр нужно около 2-4 карт Titan X :)
Suici Doga
14

Просто чтобы добавить к ответу joojaa , вещи все еще рисуются попиксельно. Вы просто генерируете пиксели, используя вершинный шейдер / ассемблер / растеризатор, затем текстурируете и освещаете их, используя фрагментный шейдер. Все это было сделано в программном обеспечении в 90-х годах, когда ваша видеокарта была не чем иным, как блиттером и буфером кадров, но это было чертовски медленно. Отсюда и изобретение современных графических процессоров.

Происходящая математика прорисовки в основном такая же, как и во времена Doom, но теперь она работает на сотнях / тысячах шейдерных ALU, а не на нескольких ядрах процессора. API-интерфейсы отображают в основном тот же набор инструкций графического процессора за кулисами. Они только для того, чтобы вам не пришлось писать тонну мрачных сборок графических процессоров на платформах разных производителей.

русс
источник