При создании системной абстракции лучше иметь на платформе разные API, скрытые общим интерфейсом на самом низком уровне, что имеет смысл.
Принимая во внимание различные современные (без конвейера с фиксированными функциями) собственные API-интерфейсы для графики: OpenGLES 2.0+, OpengGL 3.0+, DirectX 10.0+, Xbox DirectX 9, LibGCM
Если бы кто-то должен был создать низкоуровневый графический API без сохранения состояния, чтобы быть на вершине их всех, каков был бы лучший способ сделать его максимально тонким и быстрым?
architecture
software-engineering
graphics
cross-platform
NocturnDragon
источник
источник
Ответы:
Самый низкий уровень, который имеет смысл с моей точки зрения, это то, что говорит о ресурсах, задействованных в рендеринге - vb / ib, рендеринг поверхностей, текстур, шейдеров, блоков состояния и т. Д.
Проблема здесь в том, что некоторые из них должны быть в разных форматах, в зависимости от API - вот где это становится немного сложнее. Самый простой способ обойти это - предварительно обработать статические ресурсы для соответствующего API. Для динамических, используйте только шейдеры, чтобы генерировать их - это позволяет довольно просто оставаться в нативных форматах.
Все, что вы затем делаете на более высоком уровне, это настраивает конвейеры с подключенными ресурсами и передает их в графический процессор. Вы обнаружите, что таким образом не все может быть абстрагировано, особенно, если вы используете аппаратные приемы. Но это хорошее начало.
(Замечание: если вы рассматриваете трюки, специфичные для платформы, как особый вид ресурса, вы можете далеко продвинуть эту концепцию.)
Таким образом, в некотором роде вы создадите две вещи: менеджер аппаратных ресурсов и набор инструментов для настройки DAG из этих ресурсов.
источник
Учитывая широкий диапазон API-интерфейсов, которые вы хотите охватить, типичный подход обертывания, вероятно, будет неэффективным и сопряжен с трудностями при сопоставлении концепций API с несколькими другими API-интерфейсами, которые могут в той или иной степени поддерживать определенные функции.
В результате самым разумным подходом было бы создание функционально-ориентированного API. Хотя этот подход не позволяет пользователю API использовать все доступные функциональные возможности, он значительно упрощает реализацию каждого бэкэнда и обеспечивает оптимизацию для конкретного бэкэнда, которая иначе была бы невозможна.
Это также значительно упрощает управление неподдерживаемой функциональностью для пользователя API; им больше не нужно проверять, существует ли функция X, и определять, на какие функции это влияет, но вместо этого им нужно только запросить саму функцию, чтобы узнать, поддерживается ли она в текущей конфигурации. Даже если вы поддерживаете частичные или ограниченные режимы для функций, предоставляемый контекст значительно облегчает управление.
С точки зрения создания средства рендеринга без сохранения состояния (также известного как представление на основе представления ), как правило, используется 64-битный ключ для упаковки и отправки команд на рендеринг. С этого момента существует большая гибкость в отношении того, как выполнять команды и какую информацию отправлять в зависимости от того, какие функции и возможности вы хотите поддерживать.
источник
Начнем с того, что каждый API работает по-своему, поэтому само собой разумеется, что перенос всех вышеперечисленных API будет затруднен. Тем не менее, иногда это необходимо сделать: в какой-то момент игра просто должна работать на более чем одной платформе, независимо от того, насколько сложно это сделать.
Я думаю, что лучший способ сделать это - предложить функциональность, которая может быть реализована на всех базовых API, и абстрагировать это и только это. Если вы разрабатываете мультиплатформенную игру, вы бы не реализовали все неясные функциональные возможности, которые поддерживает каждый API, вы бы реализовали только то, что вам нужно. Это также помогает поддерживать API небольшим и быстрым.
Чтобы избежать путаницы реализации каждого отдельного API в выходные данные, компиляция должна выполняться с использованием нейтрально-зависимых от платформы заголовочных файлов и файлов кода конкретной платформы. Тогда файл кода, специфичный для целевой платформы, будет единственным, скомпилированным, сохраняя API небольшим.
источник
Об этом есть статья Эмиля Перссона (Humus) на GPU Pro.
http://gpupro.blogspot.com/2009/12/making-it-large-beautiful-fast-and.html
источник
Вы можете проверить библиотеку SDL или Allegro . Обе они представляют собой низкоуровневые, легко переносимые игровые библиотеки, в которых есть способ подключить их к контексту OpenGL, чтобы вы могли отображать там свою графику. SDL славится тем, что он перестал работать с Loki Games для портирования некоторых популярных игр 2000-х годов на Linux, а у Allegro много времени и большое сообщество разработчиков игр для любителей.
источник