Игры и другие графически насыщенные приложения используют такие платформы, как OpenGL и DirectX. Также им требуются такие функции, как пиксельный шейдер и DX12.
Но зачем нам все эти фреймворки и функции GPU, когда мы можем просто рисовать все пиксель за пикселем?
Во-первых, игру нужно будет компилировать так, чтобы она рисовалась попиксельно. Это может сделать исполняемый файл большим, но будет ли он быстрее и работать на любом 32-битном цветном графическом процессоре (даже старом)?
Я знаю, что первые 3D-игры были нарисованы попиксельно, но почему они не делают это сейчас?
3d
gpu
performance
pixel-shader
pixels
Суичи Дога
источник
источник
Ответы:
Скорость является наиболее распространенной причиной, почему это не сделано. Фактически, вы можете делать то, что предлагаете, если вы создаете свою собственную операционную систему, она будет очень медленной по архитектурным причинам. Так что предположение, что это быстрее, немного ошибочно. Даже если это будет быстрее, это будет менее эффективно с точки зрения разработки (например, увеличение скорости на 1% в 10 раз).
Копирование данных с ЦП на видеокарту является относительно медленной операцией. Чем меньше вы копируете, тем выше может быть скорость обновления. Поэтому в идеале вы должны располагать большей частью данных на своем графическом процессоре и обновлять только небольшие фрагменты данных. Существует различие между копированием более 320x200 пикселей по сравнению с 1920x1200 или более. Количество пикселей, которые нужно обновить, увеличивается в квадрате по мере увеличения сторон.
Пример: дешевле сказать GPU перемещать изображение на 10 пикселей вправо, чем копировать пиксели вручную в видеопамять в разных местах.
Почему вы должны пройти через API? Просто потому, что это не твоя система. Операционная система не может позволить вам делать все, что вы хотите по соображениям безопасности. Во-вторых, поскольку операционной системе необходимо абстрагировать оборудование, даже ОС взаимодействует с драйвером через какую-то абстрактную систему, API, если хотите.
На самом деле, я бы оценил вероятность того, что ваша система будет быстрее, если вы просто сделаете всю работу самостоятельно, близкой к нулю. Это немного похоже на сравнение C и сборки. Конечно, вы можете писать на ассемблере, но в наши дни компиляторы довольно умны и оптимизируют все лучше и лучше. Трудно быть лучше вручную, даже если вы можете, ваша производительность снизится до предела.
PS: API не делает это обновление невозможным, как это делали старые игры. Это просто неэффективно, вот и все. Не из-за разума API, а потому что это неэффективный период.
PPS: Вот почему они выкатывают Vulkan.
источник
See the number of pixels you need to update grows exponetially when the sides grow.
Квадратично, я думаю.работать на любом 32-битном цветном графическом процессоре (даже старом)?
Немного истории здесь: так создавались игры на ПК, пока графические ускорители не стали доступны в середине 90-х годов. Это действительно работало на всех аппаратных средствах, потому что аппаратные средства делали мало.
Графический ускоритель позволяет рисовать пиксели значительно быстрее, чем процессор, используя специальное оборудование и параллелизм. Ускоритель содержит ряд процессорных ядер. Настольный ПК будет иметь от 1 до 8 ядер в зависимости от возраста. Моя видеокарта GTX970Ti имеет 1664 (одна тысяча шестьсот шестьдесят четыре!) Ядер. Это явно превосходит ПК по сырой скорости на долгом пути.
Однако ускорители не стандартизированы и часто включают в себя странные приемы компьютерной архитектуры для достижения своей скорости. Чтобы написать игру, которая не настроена под конкретную марку и модель карты, должен существовать API. И именно для этого используются DirectX, GL и шейдерные языки. На самом деле, написание шейдера является самая близкая вещь к написанию программы, которая рисует пиксели напрямую - просто карта будет работать для вас тысячами копий этой программы параллельно, по одному на пиксель.
источник
Просто чтобы добавить к ответу joojaa , вещи все еще рисуются попиксельно. Вы просто генерируете пиксели, используя вершинный шейдер / ассемблер / растеризатор, затем текстурируете и освещаете их, используя фрагментный шейдер. Все это было сделано в программном обеспечении в 90-х годах, когда ваша видеокарта была не чем иным, как блиттером и буфером кадров, но это было чертовски медленно. Отсюда и изобретение современных графических процессоров.
Происходящая математика прорисовки в основном такая же, как и во времена Doom, но теперь она работает на сотнях / тысячах шейдерных ALU, а не на нескольких ядрах процессора. API-интерфейсы отображают в основном тот же набор инструкций графического процессора за кулисами. Они только для того, чтобы вам не пришлось писать тонну мрачных сборок графических процессоров на платформах разных производителей.
источник