2009-05-19 9 views
7

Hemos creado una aplicación OpenGL en C++ que visualiza algunas simulaciones físicas. La aplicación básica está contenida en una DLL que es utilizada por una GUI simple. Actualmente se ejecuta en una PC de escritorio, pero tenemos la idea de convertirlo en un servicio web.C++ Aplicación OpenGL como servicio web

Dado que las simulaciones requieren hardware dedicado, la idea es que un usuario, a través de su navegador pueda interactuar con nuestra aplicación como un servicio y luego el resultado sea una imagen (jpg o algo apropiado) que pueda se mostrará/actualizará en el navegador.

Mi pregunta: ¿Cómo puedo "fácilmente" convertir una aplicación de C++ como se describe en un servicio web que se ejecuta en algún servidor para que pueda abordarlo en la web? ¿Qué tipo de tecnologías/API debería ver? ¿Y hay ejemplos de la vida real que aborden un problema similar?

+0

¿Con qué frecuencia se pretende actualizar la imagen? –

+0

Eso sería después de cada interacción del usuario. Ligeramente vago, pero el escenario típico sería: un cambio de parámetro -> algún tiempo para la simulación -> renderizar y escribir en la imagen -> actualizar la imagen del navegador. Entonces no hay necesidades difíciles en tiempo real en este caso. – user62146

+0

¿Cuánta gente piensa soportar al mismo tiempo? ¿Es el acceso para todos, o solo un conjunto conocido de usuarios? ¿ven todos los usuarios lo que hacen otros usuarios, una instancia de la aplicación o varias? –

Respuesta

5

Esto es posible, pero una de las principales dificultades que tendrá es tratar de usar OpenGL desde un servicio web. Tendrá que portar esto para hacer una representación 100% fuera de pantalla y trabajar sin un contexto de ventana. Ese sería mi primer paso, y no siempre es trivial.

Además, es muy difícil mantener y administrar sus contextos de OpenGL desde un servicio web correctamente, y la sobrecarga involucrada puede ser bastante dolorosa. Dependiendo del número y los tipos de representaciones, puede encontrar algunos problemas allí.

1

Si sus necesidades de interacción con el usuario son simples, simplemente miraría CGI. Debería ser bastante fácil de entender.

En cuanto a obtener la salida del programa OpenGL, eche un vistazo a la extensión de framebuffer. Eso debería facilitar su procesamiento en la memoria, que luego podría alimentar a un compresor JPEG.

3

Si lo necesita para escalar bien CGI probablemente sería un poco lento & hacky.

Existen algunos frameworks web C++, ver this question.

Por lo que respecta al OpenGL, es probable que necesite utilizar la extensión de búfer de cuadro como dijo Jay. Podría renderizar su imagen en una textura y usar glGetTexImage() para tomar los datos de píxeles. A partir de ahí, solo guárdelo en el formato de imagen que desee con la biblioteca que lo acompaña.

1

Supongo que ya tiene acceso a algún servidor web, p. Apache o similar. En ese caso, puede probar CppServ.

Solo necesita configurar su servidor web para que pueda comunicarse con CppServ. Entonces le propongo que desarrolle un servlet (consulte la documentación en el sitio) que a su vez se comunica con su dll ya existente. Dado que el dll sabe todo sobre OpenGL, no debería haber problema para crear imágenes JPEG, etc.

3

Tenía un project/question similar, que aunque no era un servicio web, requería la representación de OpenGL en un servicio de Windows. Tuve muchos problemas para hacerlo funcionar en Vista, aunque finalmente funcionó en XP con OpenGL regular.

Finalmente intenté usar Mesa, que construí para que funcionara como una DLL privada para mi servicio. Fue una gran decisión porque ahora podía entrar en las llamadas de OpenGL y ver dónde iban las cosas mal. Funcionó bien en modo de software bajo el servicio, y aunque no fue acelerado por hardware, funcionó muy bien.

1

¿Qué le parece usar algo como Flex para crear una 'interfaz de control' habilitada para la web, con un backend de servidor que transmita la representación OpenGL como video? Básicamente, está redirigiendo la entrada de teclado/mouse a través de la aplicación Flex y usándola para mostrar actividad 3D en "tiempo real" utilizando un componente de película estándar.

El diablo está en los detalles, por supuesto ....

0

Usted puede tratar de utilizar O3D API de Google y no hacer anysort de servicio, sería mucho más sencilla.

+1

Corrígeme si me equivoco, pero el problema es que todo se ejecutará localmente en el lado del cliente, ¿verdad? Esto es un "problema" porque las simulaciones son bastante pesadas y queremos ponerlas a disposición de cualquier usuario (incluso las móviles) en prácticamente cualquier sistema con un navegador. – user62146

+0

¿Estás seguro de que podrás ejecutar un servicio tan pesado de una manera rentable? Las soluciones laterales inteligentes accesibles desde el navegador serían mucho más económicas para usted. – user109074

0

esta pregunta puede sonar muy básico y elemental, ¿ha intentado este enfoque

  1. Enviar los datos vectoriales desde el servidor al cliente o viceversa (sólo coordina y así sucesivamente)

  2. Renderícelo en el lado del cliente.

Esto significa que el servidor solo está haciendo los cálculos y los números se pasan de aquí para allá.

Acepto que no es un método trivial de tratar de vectorizar cada objeto/modelo y textura, pero es muy rápido ya que en lugar de imágenes gráficas pesadas, solo se envían datos vectoriales.

Cuestiones relacionadas