2009-05-19 12 views
7

Abbiamo creato un'applicazione OpenGL in C++ che visualizza alcune simulazioni fisiche. L'applicazione di base è contenuta in una DLL che viene utilizzata da una semplice GUI. Attualmente funziona su un PC desktop, ma abbiamo l'idea di trasformarlo in un servizio web.Applicazione C++ OpenGL come servizio Web

Poiché le simulazioni richiedono hardware dedicato, l'idea è che un utente, tramite il suo browser, possa interagire con la nostra applicazione come servizio e questo servizio restituisca il risultato a un'immagine (jpg o qualsiasi cosa appropriata) che può quindi essere visualizzato/aggiornato nel browser.

La mia domanda: Come posso "facilmente" trasformare un'applicazione C++ come descritto in un servizio web che gira su qualche server in modo che possa accedervi sul web? Che tipo di tecnologie/API dovrei guardare? E ci sono esempi di vita reale che affrontano un problema simile?

+0

Quanto spesso l'immagine deve essere aggiornata? –

+0

Ciò avverrebbe dopo ogni interazione dell'utente. Leggermente vago, ma lo scenario tipico sarebbe: un cambio di parametro -> un po 'di tempo per la simulazione -> rendering e scrittura su immagine -> aggiornamento dell'immagine del browser. Quindi, in questo caso, non è necessario un duro bisogno in tempo reale. – user62146

+0

Quanti utenti hai intenzione di supportare allo stesso tempo? È l'accesso per tutti o solo per un gruppo noto di utenti? tutti gli utenti vedono cosa fanno gli altri utenti: un'istanza dell'applicazione o più? –

risposta

5

Questo è possibile, ma una delle principali difficoltà che si hanno è provare a utilizzare OpenGL da un servizio web. Dovrai effettuare il porting per eseguire il rendering al 100% offscreen e lavorare senza un contesto di windowing. Questo sarebbe il mio primo passo, e non è sempre banale.

Inoltre, è molto difficile mantenere e gestire correttamente i contesti di opengl da un servizio web e il sovraccarico potrebbe essere molto doloroso. A seconda del numero e dei tipi di rendering, potresti riscontrare alcuni problemi.

1

Se le esigenze di interazione dell'utente sono semplici, guarderei semplicemente CGI. Dovrebbe essere abbastanza facile da capire.

Per quanto riguarda l'output del programma OpenGL, darei un'occhiata all'estensione del framebuffer. Ciò dovrebbe rendere più semplice il rendering in memoria, che potrebbe quindi essere inserito in un compressore JPEG.

3

Se ne avete bisogno per scalare bene CGI sarebbe probabilmente un po 'lento & hacky.

Esistono alcuni framework Web C++, vedere this question.

Per quanto riguarda OpenGL, sarà probabilmente necessario utilizzare l'estensione del frame buffer come ha detto Jay. È quindi possibile eseguire il rendering dell'immagine su una trama e utilizzare glGetTexImage() per acquisire i dati dei pixel. Da lì basta salvare in qualsiasi formato di immagine che si desidera con la libreria di accompagnamento.

1

Immagino che tu abbia già accesso ad alcuni server web, ad es. Apache o simili. In tal caso potresti provare CppServ.

È sufficiente configurare il server Web in modo che possa comunicare con CppServ. Proporrei quindi di sviluppare un servlet (controlla la documentazione sul sito) che a sua volta comunica con la tua DLL già esistente. Dal momento che la dll sa tutto su OpenGL, non dovrebbe esserci alcun problema per creare immagini jpeg ecc.

3

Avevo un simile project/question, che sebbene non fosse un servizio Web, richiedeva il rendering OpenGL in un servizio Windows. Ho avuto un sacco di problemi nel farlo funzionare su Vista, anche se alla fine ha funzionato su XP con OpenGL regolare.

Ho finalmente provato a utilizzare Mesa, che ho creato per funzionare come DLL privata per il mio servizio. È stata una grande decisione perché ora potevo davvero entrare nelle chiamate OpenGL e vedere dove le cose stavano andando male. Funzionava bene in modalità software sotto il servizio e, sebbene non fosse accelerato dall'hardware, funzionava molto bene.

1

Che ne dici di utilizzare qualcosa come Flex per creare un'interfaccia di controllo abilitata al web, con un back-end del server che trasmette il rendering opengl come video? In pratica, stai reindirizzando l'input da tastiera/mouse tramite l'app Flex e utilizzandolo per visualizzare attività 3D "in tempo reale" utilizzando un componente filmato standard.

Il diavolo è nei dettagli, ovviamente ....

0

Si può cercare di utilizzare O3D API da Google e non fare anysort del servizio, sarebbe molto più semplice.

+1

Correggetemi se ho torto, ma il problema è che tutto funzionerebbe ancora localmente sul lato client, giusto? Questo è un "problema" perché le simulazioni sono piuttosto pesanti e vogliamo renderle disponibili a qualsiasi utente (magari anche mobili) praticamente su qualsiasi sistema con un browser. – user62146

+0

Sei sicuro di essere in grado di eseguire un servizio così pesante in modo economico? Le soluzioni secondarie di Cleint accessibili dal browser sarebbero molto più economiche per te. – user109074

0

Questa risposta potrebbe sembrare molto semplice ed elementare, avete provato questo approccio

  1. Invia i dati vettoriali dal server al client o viceversa (solo coordinate e così via)

  2. Renderlo sul lato client.

Ciò significa che il server esegue solo i calcoli ei numeri vengono passati avanti e indietro.

Sono d'accordo che non è un metodo banale di cercare di vettorializzare ogni oggetto/modello e trama, ma è molto veloce poiché invece di immagini grafiche pesanti che attraversano, vengono inviati solo dati vettoriali.

Problemi correlati