2009-05-19 2 views
7

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

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

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

+0

Как часто изображение должно обновляться? –

+0

Это будет после каждого взаимодействия с пользователем. Немного туманный, но типичным сценарием будет: изменение параметра -> некоторое время для моделирования -> визуализация и запись в изображение -> обновление изображения браузера. Таким образом, в этом случае нет жестких потребностей в реальном времени. – user62146

+0

Сколько пользователей вы планируете поддерживать в то время? Доступен ли он для всех или только для известных пользователей? все пользователи видят, что делают другие пользователи - один экземпляр приложения или несколько? –

ответ

5

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

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

1

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

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

3

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

Есть некоторые веб-фреймворки C++, см. this question.

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

1

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

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

3

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

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

1

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

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

0

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

+1

Исправьте меня, если я ошибаюсь, но проблема в том, что все будет выполняться локально на стороне клиента, верно? Это «проблема», потому что симуляции довольно тяжелые, и мы хотим сделать их доступными для любого пользователя (возможно, даже для мобильных) практически для любой системы с браузером. – user62146

+0

Вы уверены, что сможете выполнять такое тяжелое обслуживание экономичным способом? Решение Cleint Side, доступное из браузера, будет намного дешевле для вас. – user109074

0

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

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

  2. Оформить его на стороне клиента.

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

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

Смежные вопросы