#c #opengl #graphics #glfw
Вопрос:
Контекст
Я разрабатываю архитектуру на основе плагинов, которая предназначена для того, чтобы каждый плагин мог использовать свой собственный графический API, если он может передавать стандартный формат текстуры, который движок может принимать и визуализировать, используя основной графический контекст OpenGL и шейдеры. В идеале, каждый плагин не будет знать и не будет иметь доступа к основному графическому контексту OpenGL, используемому движком. Это означает, что каждый плагин должен предоставлять свой собственный контекст и отображать графику в текстуре.
Проблема
Моя текущая реализация обрабатывает копирование текстур из одного контекста в другой, копируя данные текстур в память процессора, а затем копируя память процессора обратно в графический процессор для отображения основного контекста OpenGL. Поэтому, чем больше плагинов я запускаю, тем медленнее работает мое программное обеспечение, так как все это происходит в одном потоке. Я смог использовать общие контексты в некоторых редких сценариях, где плагин использует тот же графический API, что и основной графический контекст OpenGL. В противном случае я не смог использовать общие контексты, поскольку библиотеки, такие как GLFW, не предоставляют необходимый API для достижения общих контекстов с внешними библиотеками.
Вопрос
Каковы были бы некоторые решения для повышения производительности, отображающие реализацию нескольких плагинов в текстуру, чтобы основной контекст мог отображаться для отображения?
Дополнительные Мысли
Мое текущее решение состоит в том, чтобы попытаться запустить каждый плагин в отдельном потоке, где будет происходить внутренний контекст и рендеринг, а затем точка синхронизации, в которой все плагины должны скопировать свои текстуры обратно в основной контекст в основном потоке. Прежде чем я пойду по этому пути, я хотел убедиться, что нет другого возможного решения, которое я мог бы использовать.
При крайней необходимости я мог бы увидеть сценарий, в котором мое программное обеспечение передавало бы основной контекст, позволяя плагинам использовать его для создания общих контекстов. В этом сценарии мне не нужно было бы копировать текстуры в память процессора, и я просто передал бы указатель текстуры. Это было бы последним отчаянным решением проблемы, которую я пытаюсь решить.
Комментарии:
1. Как насчет совместного использования объектов между контекстами ?
2. @HolyBlackCat Если я не ошибаюсь, похоже, что решение зависит от API GLFW. Итак, если мой основной контекст-GLFW, но мой API плагинов использует, скажем, OpenSceneGraph для визуализации графики, я не смогу делиться их контекстами друг с другом.
Ответ №1:
Такого понятия, как бесплатный обед, не существует. Цена, которую вы платите за АПИ-агностицизм, заключается в том, что вы отказываетесь от любой эффективности, которую позволяло бы знание API. В OpenGL есть механизмы, позволяющие одному контексту обмениваться объектами с другим. Но если вы решили, что не знаете/вам все равно, использует ли плагин OpenGL, вам придется кодировать против самого низкого распространенного демонатора. И в данном случае это означает копирование текстур через центральный процессор.
Это будет не быстро, но именно к этому привел вас ваш дизайнерский выбор.
Было бы проще или разумнее просто перестать быть таким агностиком. Вы должны сообщить плагинам, что вы используете OpenGL и что они тоже должны использовать OpenGL. И вы должны заставить их использовать созданные вами контексты OpenGL, которые позволяют вам делиться с ними своими объектами.
Это делает все очень простым. И эффективно.