При создании средства визуализации, поддерживающего несколько графических API, вы, как правило, захотите абстрагировать код в какую-то низкоуровневую библиотеку, связанную с некоторыми графическими API, такими как OpenGL, Vulkan, D3D11 и т. Д .;
Они работают очень по-разному друг от друга, поэтому создание хорошего общего API становится необходимым; Я читал, что вы, как правило, хотите использовать «бэкэнд», который реализует базовую функциональность для каждого API, который вы хотите поддерживать, и «интерфейс», который используется программистом для рисования материала на экран.
Как я узнаю, что делаю слишком много жесткой абстракции?
graphics-programming
Габриэле Виерти
источник
источник
Ответы:
Прежде всего, подумайте, стоит ли на самом деле поддерживать более одного графического API. Простое использование OpenGL охватит большинство платформ и будет «достаточно хорошим» для всех проектов, кроме самых амбициозных в графическом отношении. Если вы не работаете в очень большой игровой студии, которая может позволить себе потратить несколько тысяч человеко-часов на реализацию и тестирование нескольких бекендов рендеринга, и если нет каких-то специфических функций DirectX или Vulcan, которые вы действительно хотите продемонстрировать, то это обычно не стоит хлопот , Особенно учитывая, что вы можете сэкономить много работы, используя слой абстракции, созданный кем-то другим (сторонняя библиотека или игровой движок).
Но давайте предположим, что вы уже оценили свои варианты и пришли к выводу, что он и жизнеспособен, и стоит потратить время на свои собственные.
Тогда главным судьей архитектуры программного обеспечения вашего уровня абстракции будут ваши внешние программисты.
Если так, то вам это удалось.
источник
Начните с определения того, что вам действительно нужно, из части «обертки» API. Как правило, все очень и очень просто: вам нужны базовые ресурсы (буферы, шейдеры, текстуры, состояние конвейера) и способ использовать эти ресурсы для создания фрейма путем отправки некоторых вызовов отрисовки.
Старайтесь держать любую логику высокого уровня из оберточной части API. Если вы реализуете умную технику отбраковки сцены в этой части API, то теперь вы готовы к дублированию этой логики во всех реализациях бэкэнда. Это много дополнительных усилий, так что будьте проще. Управление сценой должно быть частью высокоуровневой части API, которая использует оболочку, а не часть самой оболочки.
Выберите цели, которые вы будете поддерживать, и поймите их. Трудно написать приличные обертки для «всего», и вам, вероятно, не нужно (возможно, вам также не нужно писать ни одной обертки, как отмечено в ответе Филиппа ). Почти невозможно написать достойную оболочку, если вы не знаете API, который вы собираетесь обернуть.
Оцените состояние вашего API регулярно. Обычно он должен иметь меньшую площадь поверхности, чем нижележащие API-интерфейсы; если вы обнаружите, что создаете типы-обертки один-к-одному для каждой структуры D3D или для каждого вызова функции OpenGL, вы, вероятно, отклоняетесь от курса.
Посмотрите, какая работа прошла раньше. Sokol и BGFX - это API, которые предоставляют уровни агностицизма, которые могут быть полезны для вас и относительно просты для понимания (особенно для первого).
источник
Еще один момент, о котором вы еще не упомянули, который вы должны рассмотреть, это каковы ваши цели производительности Если ваша цель состоит в том, чтобы иметь графическую библиотеку, которая будет обеспечивать хорошую производительность за счет дешевой аппаратной платформы, но также будет использоваться на различных платформах, которые являются значительно более мощными, но используют другой API, возможно, имеет смысл разработать свой API вокруг какие бы абстракции не использовались изначально на платформе, где производительность является проблемой. Даже если это приводит к снижению скорости на 50% на более мощных платформах, оно может стоить того, если позволяет повысить скорость на 20% на платформе, где производительность важнее всего.
источник