2009-05-19 8 views
7

Nous avons créé une application OpenGL en C++ qui visualise des simulations physiques. L'application de base est contenue dans une DLL qui est utilisée par une interface graphique simple. Il fonctionne actuellement sur un PC de bureau, mais nous avons l'idée de le transformer en un service web. Puisque les simulations nécessitent un matériel dédié, l'idée est qu'un utilisateur, via son navigateur, puisse interagir avec notre application en tant que service et que ce service rende ensuite le résultat à une image (jpg ou autre chose appropriée) qui peut alors être affiché/mis à jour dans le navigateur.Application OpenGL C++ en tant que service web

Ma question: Comment puis-je "facilement" transformer une application C++ comme décrit dans un service web qui fonctionne sur un serveur pour que je puisse l'aborder sur le web? Quel type de technologies/API devrais-je regarder? Et y a-t-il des exemples de la vie réelle qui s'attaquent à un problème similaire?

+0

À quelle fréquence l'image doit-elle être mise à jour? –

+0

Ce serait après chaque interaction de l'utilisateur. Légèrement vague, mais le scénario typique serait: un changement de paramètre -> un peu de temps pour la simulation -> rendre et écrire à l'image -> mettre à jour l'image du navigateur. Donc pas de besoins en temps réel dans ce cas. – user62146

+0

Combien d'utilisateurs envisagez-vous de prendre en charge en même temps? Est-ce l'accès pour tout le monde, ou seulement un ensemble connu d'utilisateurs? tous les utilisateurs voient-ils ce que les autres utilisateurs font - une instance de l'application, ou plusieurs? –

Répondre

5

Ceci est possible, mais l'une des principales difficultés que vous rencontrerez est d'essayer d'utiliser OpenGL à partir d'un service Web. Vous devrez le porter pour faire un rendu 100% hors écran et travailler sans contexte de fenêtrage. Ce serait mon premier pas, et ce n'est pas toujours banal.

De plus, il est très difficile de gérer et de gérer correctement vos contextes opengl à partir d'un service web, et les frais généraux impliqués peuvent être très pénibles. Selon le nombre et les types de rendus, vous pouvez rencontrer des problèmes.

1

Si vos besoins d'interaction avec les utilisateurs sont simples, je regarderais simplement CGI. Cela devrait être assez facile à comprendre.

En ce qui concerne l'obtention de la sortie du programme OpenGL, je regarderais l'extension framebuffer. Cela devrait vous faciliter la tâche de restitution en mémoire, qui pourrait ensuite être introduite dans un compresseur JPEG.

3

Si vous en avez besoin pour augmenter l'échelle CGI serait probablement un peu lent & hacky. Il existe quelques frameworks Web C++, voir this question.

En ce qui concerne OpenGL, vous aurez probablement besoin d'utiliser l'extension du tampon d'image comme l'a dit Jay. Vous pouvez ensuite rendre votre image à une texture et utiliser glGetTexImage() pour saisir les données de pixel. De là, enregistrez simplement dans quel format d'image que vous voulez avec la bibliothèque qui l'accompagne.

1

Je suppose que vous avez déjà accès à un serveur Web, par ex. Apache ou similaire. Dans ce cas, vous pouvez essayer CppServ.

Vous avez juste besoin de configurer votre serveur web pour qu'il puisse communiquer avec CppServ. Je proposerais alors que vous développiez une servlet (vérifiez la documentation sur le site) qui à son tour communique avec votre DLL déjà existante. Comme la DLL sait tout sur OpenGL, il ne devrait pas y avoir de problème pour créer des images jpeg etc.

3

J'ai eu un project/question similaire, que bien que ce n'était pas un service web, il nécessitait le rendu OpenGL dans un service Windows. J'ai eu des tonnes de problèmes à le faire fonctionner sur Vista, bien que finalement il a travaillé sur XP avec OpenGL régulier.

J'ai finalement essayé d'utiliser Mesa, que j'ai construit pour fonctionner comme une DLL privée pour mon service. Ce fut une excellente décision car je pouvais maintenant entrer dans les appels OpenGL et voir où les choses se passaient mal. Il fonctionnait bien en mode logiciel sous le service, et même s'il n'était pas accéléré par le matériel, il fonctionnait très bien.

1

Que diriez-vous d'utiliser quelque chose comme Flex pour créer une «interface de contrôle» Web, avec un backend de serveur qui transmet le rendu opengl en vidéo? Fondamentalement, vous redirigez l'entrée clavier/souris via l'application Flex, et vous l'utilisez pour afficher l'activité 3D 'temps réel' en utilisant un composant de film standard.

dans les détails du diable, bien sûr ....

0

Vous pouvez essayer d'utiliser O3D API de Google et ne pas faire anysort de service, il serait beaucoup plus simple.

+1

Corrigez-moi si je me trompe, mais le problème avec ceci est que tout fonctionnerait encore localement chez le client, n'est-ce pas? C'est un "problème" car les simulations sont assez lourdes et nous voulons les rendre accessibles à n'importe quel utilisateur (peut-être même mobile) sur pratiquement n'importe quel système avec un navigateur. – user62146

+0

Etes-vous sûr que vous serez en mesure d'exécuter un tel service lourd d'une manière rentable? Les solutions latérales de Cleint accessibles depuis le navigateur seraient beaucoup moins chères pour vous. – user109074

0

Cette réponse peut paraître très basique et élémentaire, avez-vous essayé cette approche

  1. Envoyer les données vectorielles du serveur au client ou vice-versa (seulement les coordonnées et ainsi de suite)

  2. Rendez-le du côté client.

Cela signifie que le serveur effectue uniquement les calculs et que les numéros sont transmis de gauche à droite. Je suis d'accord que ce n'est pas une méthode triviale d'essayer de vectoriser chaque objet/modèle et texture, mais c'est très rapide car au lieu d'images graphiques lourdes traversant, seules les données vectorielles sont envoyées.