Мне действительно нужно использовать графический API?


22

Нужно ли использовать графические API-интерфейсы для получения аппаратного ускорения в 3D-игре? В какой степени можно освободиться от зависимостей от API-интерфейсов видеокарт, таких как OpenGL, DirectX , CUDA, OpenCL или что-то еще?

Могу ли я сделать свой собственный графический API или библиотеку для своей игры? Даже если это сложно, теоретически возможно ли для моего 3D-приложения независимо связаться с графическим драйвером и визуализировать все на GPU?


30
CUDA и OpenCL не являются графическими API.
Мыльный

4
Чтобы «самостоятельно связаться с графическим драйвером», вам всегда нужен API!
Иосиф

21
Нет, вам не нужен API для графики, вы можете получить доступ к драйверу напрямую, он даже не останавливается на достигнутом, вы можете написать свой собственный драйвер, чтобы напрямую взаимодействовать с оборудованием, если вы когда-нибудь захотите этого. Но ваш следующий вопрос гораздо важнее: «Должен ли я использовать графический API?», Да, да, вы должны.
Кевин

5
Вы, люди, понимаете, что API также сделан в одной точке? Драйвер подвергается внешним вызовам, которые API реализует и превращает в удобные и простые в использовании вызовы API.
Кевин

3
Нет графической карты (или ОС, на данный момент), которая не поддерживает OpenGL. Он буквально работает на все, поэтому, если единственная причина, по которой вы не хотите его использовать, заключается в «совместимости», это совершенно беспочвенная проблема.
Sandalfoot

Ответы:


39

Я думаю, что во многих ответах упущен важный момент: вы можете писать приложения, которые имеют прямой доступ к оборудованию, но не в современных операционных системах . Это не просто проблема времени, но проблема «у вас нет выбора».

Windows, Linux, OSX и т. Д. Запрещают прямой аппаратный доступ к произвольным приложениям. Это важно по соображениям безопасности: вы не хотите, чтобы какое-либо случайное приложение могло читать произвольную память графического процессора, по той же причине, по которой вы не хотите, чтобы какое-либо случайное приложение могло читать системную память. Такие вещи, как кадровый буфер для вашего банковского счета или еще что-то, хранящееся в памяти GPU. Вы хотите, чтобы этот материал был изолирован и защищен, а доступ контролировался вашей ОС.

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

Так что нет, ваша игра не может просто использовать аппаратное обеспечение напрямую, если, конечно, вы не нацелены только на небезопасные операционные системы, такие как DOS, и ваша единственная реальная возможность для игры на современных потребительских операционных системах - нацеливаться на открытый API, такой как DirectX, OpenGL или Vulkan.


Слава, хорошее дополнение к обсуждению. Ты узнаешь что-то новое каждый день.
инженер

1
Что ограничивает ваш выбор написания модуля ядра для аппаратного доступа? Кроме того, если вы ориентируетесь на одну карту (ту, которая установлена ​​на вашем компьютере), проблемы совместимости отпадут; хотя это еще далеко от тривиальной вещи; но в пределах возможного, учитывая обратные инженерные драйверы; особенно если у вас есть только ограниченный объем того, что вы хотите сделать с картой.
Джоэл Босвелд

1
Подписание драйверов во многих ОС затрудняет распространение вашего модуля. Конечно, вы могли бы создавать всевозможные драйверы ОС и хаки локально, но вы не сможете распространять свою игру очень широко, что, как я предположил, является желательным аспектом, так как ОП спрашивает о создании реальной игры, а не бессмысленной техническая демонстрация : p
Шон Миддледич

27

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

Единственная реалистичная альтернатива состоит в том, что вы не используете 3D-ускорение, а вместо этого идете на программный рендеринг, который, при условии, что он написан на чем-то действительно портативном, например, C, сможет работать практически на любой системе / устройстве. Это хорошо для небольших игр ... что-то вроде SDL подходит для этой цели ... есть и другие. Но для этого не хватает встроенных возможностей 3D, поэтому вам придется создавать их самостоятельно ... что не является тривиальной задачей.

Также помните, что рендеринг процессора неэффективен и страдает от низкой производительности по сравнению с графическими процессорами.


11
В пользу OP: рендеринг программного обеспечения также имеет значительно более низкую производительность. Хотя это может не иметь значения с точки зрения частоты кадров для более простых игр, я сомневаюсь, что многие клиенты оценят сокращение времени работы от батареи, от которого они страдают, потому что программный рендеринг поддерживает их ЦП гораздо более активным, чем это было бы в противном случае.
Крис Хейс

1
Хороший вопрос, @ChrisHayes ... отредактировано, чтобы добавить. Иногда считается, что такие вещи очевидны.
Инженер

1
Похоже, ваш первый абзац говорит, что технически нет необходимости использовать API. Конечно, это экономит огромное количество времени программиста, возможно, больше, чем один человек может предложить, но это не обязательно . Как и следовало ожидать, если между драйвером графической карты и программными библиотеками более высокого уровня не происходит какая-либо криптографическая проверка.
Дэвид Z

5
@DavidZ Вы написали драйвер? Знаете ли вы, каково это взаимодействовать со сложным аппаратным обеспечением, когда у вас даже нет спецификаций, когда даже инженеры, нанятые производителем карты, занимали человеко-месяцы, чтобы разработать драйвер? Теперь умножьте это на любое количество архитектур, которые вы должны поддерживать. Если я скажу: «Невозможно подняться на Эверест без снаряжения», конечно, есть шанс, что вы можете, но на самом деле это очень маленький шанс ... почему кто-то будет спорить?
инженер

1
Спросите у ОП, почему они хотят спорить по этому вопросу ;-), но особенно после редактирования совершенно ясно, что они этого хотят.
Дэвид Z

8

Такие API, как OpenGL или DirectX, частично реализованы операционной системой и частично реализованы самим графическим драйвером.

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


6

Загрузите свой компьютер в MS-DOS. Затем, используя свою копию энциклопедии PC Game Programmers , вы можете записать ее непосредственно в VESA карты. регистры и в видеопамять. У меня все еще есть код, который я написал 20 лет назад, чтобы сделать это и визуализировать элементарные 3D в программном обеспечении.

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

Существует также экстремальный подход к созданию собственного видеооборудования .


4

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

Однако это не означает, что вы должны быть на 100% зависимы от одного конкретного API. Вы всегда можете закодировать свой собственный уровень абстракции, а затем поменять местами более конкретные реализации (например, реализацию DirectX, реализацию OpenGL, ...).

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


4

Итак, теоретически вы можете, но это невозможно, и вы не получите никакого преимущества. Ограничения API сегодня становятся меньше с каждым днем, у вас есть CUDA и OpenCL и шейдеры. Таким образом, полный контроль больше не проблема.


Более полное объяснение:

Ответить на это скучно да . Реальный вопрос почему ?

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

С графическими процессорами вы получаете «лучшую» производительность, но теряете много свободы. Разработчики графики стремятся вернуть эту свободу. Следовательно, все больше и больше настроек каждый день. Вы можете делать практически все, используя CUDA / OpenCL и даже шейдеры, не касаясь драйверов.


1

Вы хотите поговорить с оборудованием. Вам нужно использовать способ общения с оборудованием. Таким образом, интерфейс для оборудования. Вот что такое OpenGL, DirectX, CUDA, OpenCL и все остальное.

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


1

Чтобы получить аппаратное ускорение 3D без использования традиционного API, вам необходимо написать собственный код, дублирующий функциональность графического драйвера. Поэтому лучший способ узнать, как это сделать, - взглянуть на код графического драйвера.

Что касается карт NVIDIA, вы должны взглянуть на проект nouveau с открытым исходным кодом . У них есть коллекция отличных ресурсов здесь .

Для видеокарт других марок вы можете найти похожие проекты и документацию.

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


1

Избавление от DirectX или OpenGl не приведет к удалению зависимостей, оно представит их больше. Другие ответы уже содержат несколько хороших моментов, почему может даже не быть возможности напрямую общаться с графическим оборудованием (по крайней мере, это неосуществимо), но мой первый ответ был бы: Если бы вы действительно написали библиотеку, которая абстрагирует все распространенные 3D графическое оборудование в единый API, вы бы эффективно переписали DirectX / OpenGl. Если бы вы использовали свой код для написания игры, вы бы добавили новую библиотеку в качестве новой зависимости, точно так же, как у вас теперь есть DirectX / OpenGl в качестве зависимости.

Используя DirectX или OpenGl, ваши зависимости в основном говорят: «Этот код зависит от библиотеки, чтобы предоставить код, объясняющий, как выполнять определенные команды на разных видеокартах». Если бы вы обходились без такой библиотеки, вы бы вводили зависимость «Этот код зависит от графического оборудования, которое ведет себя точно так же, как и оборудование, существовавшее при создании игры».

Абстракции, такие как OpenGl или DirectX, позволяют производителям оборудования предоставлять собственный код (драйверы), который приводит к общей базе кода, поэтому игры с большей вероятностью будут работать на оборудовании, которого даже не было на момент написания игры.


0

Прежде всего, CUDA и OpenCL не являются графическим интерфейсом API. Они вычисляют API.

Проблема написания вашего собственного графического API в том, что он очень сложный. Вы можете напрямую взаимодействовать с оборудованием, но нет гарантии, что, если оно работает в системе с X CPU, X GPU, X Ram и X, то оно будет работать в системе с Y CPU, Y GPU и т. Д. Хорошим моментом является то, что DirectX работает с драйверами режима ядра. Это внедрено в ядро. Кроме того, графические интерфейсы не созданы для поддержки графических процессоров. Графические процессоры (и их драйверы) созданы для их поддержки. Таким образом, вы в значительной степени не сможете создать графический API, если вы не создадите свою собственную ОС и не используете предоставляемые x86 VGA-прерывания. Но вы все равно не сможете правильно взаимодействовать с графическим процессором, и вы застрянете в низком разрешении.

Я понимаю, что вы хотите построить все самостоятельно, а не использовать двигатель или что-то подобное. Но создание собственной графики API просто создаст неудобства для пользователя.


0

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.