Приложение C ++ OpenGL как веб-сервис - PullRequest
7 голосов
/ 19 мая 2009

Мы создали приложение OpenGL на C ++, которое визуализирует некоторые физические симуляции. Основное приложение содержится в DLL, которая используется простым графическим интерфейсом. В настоящее время он работает на настольном ПК, но у нас есть идея превратить его в веб-сервис.

Поскольку для моделирования требуется выделенное аппаратное обеспечение, идея состоит в том, что пользователь через свой браузер может взаимодействовать с нашим приложением в качестве службы, и эта служба затем отображает результат в изображение (jpg или что-либо соответствующее), которое затем отображается / обновляется в браузере.

Мой вопрос: Как я могу "легко" превратить приложение c ++, как описано, в веб-сервис, работающий на каком-либо сервере, чтобы я мог обращаться к нему через Интернет? На какие технологии / API я должен смотреть? И есть ли реальные примеры, которые решают подобную проблему?

Ответы [ 8 ]

5 голосов
/ 19 мая 2009

Это возможно, но одной из основных трудностей, с которыми вы столкнетесь, является попытка использовать OpenGL из веб-службы. Вам нужно будет перенести это на 100% за пределами рендеринга и работать без оконного контекста. Это был бы мой первый шаг, и он не всегда тривиален.

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

3 голосов
/ 19 мая 2009

У меня был похожий проект / вопрос , что, хотя это не был веб-сервис, для него требовался рендеринг OpenGL в службе Windows. У меня было множество проблем, чтобы заставить его работать на Vista, хотя в конечном итоге он работал на XP с обычным OpenGL.

Я наконец-то попытался использовать Mesa , которую я построил, чтобы работать как частная DLL для моей службы. Это было отличное решение, потому что теперь я мог фактически вступать в вызовы OpenGL и видеть, где что-то идет не так. Он отлично работал в программном режиме службы и хотя аппаратно не ускорялся, он работал очень хорошо.

3 голосов
/ 19 мая 2009

Если вам нужно хорошо масштабироваться, CGI, вероятно, будет медленным и хакерским.

Существуют некоторые веб-фреймворки C ++, см. этот вопрос .

Что касается OpenGL, вам, вероятно, потребуется использовать расширение буфера кадров, как сказал Джей. Затем вы можете визуализировать ваше изображение в текстуру и использовать функцию glGetTexImage (), чтобы получить данные пикселей. Оттуда просто сохраните в любой формат изображения, который вы хотите с сопровождающей библиотекой.

1 голос
/ 19 мая 2009

Как насчет использования чего-то вроде Flex для создания веб-интерфейса управления, с серверным бэкэндом, который транслирует рендеринг opengl как видео? По сути, вы перенаправляете ввод с клавиатуры / мыши через приложение Flex и используете его для отображения 3D-активности в реальном времени с использованием стандартного компонента фильма.

Дьявол в деталях, конечно ....

1 голос
/ 19 мая 2009

Полагаю, у вас уже есть доступ к какому-либо веб-серверу, например Апач или аналогичный. В этом случае вы можете попробовать CppServ .

Вам просто нужно настроить свой веб-сервер, чтобы он мог взаимодействовать с CppServ. Затем я бы предложил вам разработать сервлет (см. Документацию на сайте), который в свою очередь связывается с вашей уже существующей DLL. Поскольку dll знает все об OpenGL, не должно быть проблем с созданием изображений в формате JPEG и т. Д.

1 голос
/ 19 мая 2009

Если ваши потребности во взаимодействии с пользователем просты, я бы просто посмотрел на CGI. Это должно быть довольно легко понять.

Что касается вывода программы OpenGL, я бы взглянул на расширение фреймбуфера. Это должно упростить рендеринг в память, которая затем может быть передана в компрессор JPEG.

0 голосов
/ 03 июня 2010

Этот ответ может показаться очень простым и элементарным, вы пробовали этот подход

  1. Отправка векторных данных с сервера клиенту или наоборот (только координаты и т. Д.)

  2. Визуализируйте его на стороне клиента.

Это означает, что сервер выполняет только вычисления, а числа передаются туда и обратно.

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

0 голосов
/ 19 мая 2009

Вы можете попробовать использовать O3D API от Google и не делать никаких услуг, это было бы намного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...