Sviluppo multipiattaforma C ++ / OpenGL ES (iOS / Android) [chiuso]


10

Ho già una ragionevole esperienza con C ++ e OpenGL e di recente ho deciso di provare lo sviluppo di giochi per dispositivi mobili. Dopo aver creato con successo una semplice app OpenGL ES per Android usando Java, ho cercato modi per indirizzare sia Android che iOS con il minor codice di riscrittura possibile. Ho provato a utilizzare gli strumenti di sviluppo multipiattaforma orgogliosamente orgogliosi di Visual Studio 2015, ma li ho trovati troppo nuovi e quindi estremamente sotto documentati. Potrei costruire i progetti di template che il programma mi ha dato, ma non sono riuscito a capire come, dati questi template, potrei aggiungere risorse al gioco o gestire l'input del touchscreen.

Ho un desiderio purtroppo specifico, troppo specifico per trovarlo con Google. Voglio creare un gioco OpenGL ES usando C ++, con wrapper sottili specifici per piattaforma per Android e iOS. Le persone mi hanno fatto domande simili (anche se non esattamente le stesse) e più di una persona che ha risposto ha affermato che ciò che voglio fare non è solo possibile, ma relativamente semplice, dal momento che non devo preoccuparmi dell'interfaccia utente.

Ho provato questo tutorial , ma ha quasi tre anni e quindi probabilmente progettato per la tecnologia più vecchia, e di conseguenza ho incontrato vari bug non rilevati. A partire da ora, però, quel tutorial è la cosa più vicina a ciò che voglio che ho trovato. Tutto il resto è solo per Android o mi consiglia di pagare centinaia di dollari all'anno per utilizzare l'SDK Marmalade. A volte ho voglia di scrivere il codice due volte, una volta in Java e una volta in Objective-C, ma sono motivato dalla consapevolezza che questa soluzione è possibile, ma per qualche ragione, non trattata da nessuna parte in nessun dettaglio moderno.

Per riassumere, voglio creare un gioco OpenGL ES per iOS e Android, con una singola base di codice C ++ racchiusa in piccole quantità di codice specifico per la piattaforma. Tuttavia, nonostante il fatto che diverse persone abbiano raccomandato questo approccio, nessuno può dirmi come farlo. Qualcuno può dirmi se è effettivamente possibile e, in tal caso, cosa posso fare o dove posso andare per imparare come?



1
unity3d è lontano da ciò che l'OP sta chiedendo in quanto non si ha accesso alla fonte. Ho usato cocos2d-x e i problemi di compilazione sono ancora lì in una certa misura. Anche l'influenza dell'Obiettivo-C è avvertita, ad alcuni potrebbe piacere, ma per me è una svolta. Si tratta tuttavia di una soluzione open source, quindi forse vale la pena investigare sui PO.
Matthew Sanders,

Risposte:


6

Puoi trovare utile la mia risposta a una domanda simile qui .

Potresti anche trovare utile esaminare il codice sorgente di altre soluzioni. Il motore di Godot per esempio, è un motore di gioco piattaforma open source croce quindi non è necessario pagare nulla.

Come ho già detto nella mia altra risposta , non è necessario (e probabilmente non è possibile) fare affidamento su un IDE per svolgere il lavoro per te. CMake , Scons e molti altri strumenti di compilazione possono aiutare con il processo di compilazione / compilazione incrociata su piattaforme e IDE.

Godot motore , ad esempio, utilizza Scons e la LLVM progetto (aka il quadro compilatore utilizzato dal clang l'/ C ++ / Objective-C compilatore C) utilizza CMake .

Un approccio popolare per i giochi è quello di costruire un motore in C / C ++ e, come dici tu, astrarre le specifiche della piattaforma. Quando si tratta di iOS e Android, questa è la logica di gestione del ciclo di vita che si interfaccia con il sistema operativo. Se volevi fare il possibile e utilizzare Emscripten anche per compilare in asm.js e realizzare quasi la velocità nativa nel browser, stai facendo qualcosa di simile con l'astrazione del ciclo principale dietro ciò che equivale a richieste di chiamate AnimationFrame .

Emscripten raccomanda l'uso di SDL per semplificare il processo di port in quanto può aiutare a gestire l'astrazione delle specifiche della piattaforma, ma non c'è nulla che ti impedisca di farlo da soli (oltre a un sacco di ricerca, debug, ecc.).

Se sei davvero, davvero pazzo, puoi fare quello che sto facendo e scrivere la tua lingua usando la potenza di LLVM per compilare in C ABI nativo o addirittura JIT su piattaforme supportate.

Il punto è che sì, è davvero possibile, ma alcune strade sono più complicate / richiedono più tempo di altre.

Nota: probabilmente dovrai usare Mac OSX tramite Mac, VM o Hackintosh con XCode per compilare su iOS. Questo è uno dei tanti motivi per cui trovo un Macbook Pro un ottimo candidato per un sistema di sviluppo.

Nota 2: Vale la pena ricordare che molti motori multipiattaforma oggi utilizzano linguaggi di scripting per la logica specifica del gioco. Unity non ti consente nemmeno di avvicinarti al loro codice sorgente, ad esempio (anche se puoi scrivere plugin nativi). Questo può aiutare ad accelerare i cicli di sviluppo, nonché a ridurre al minimo il porting in quanto i linguaggi di scripting sono abbastanza indipendenti dalla piattaforma (specialmente i linguaggi interpretati in esecuzione in una macchina virtuale). L'obiettivo per la mia lingua è consentire sia JIT (principalmente per risparmiare tempo di sviluppo) sia compilazione statica.

Nota 3: se non lo hai già scoperto. Se non si utilizza SDL o qualche altra soluzione che assorbe le specifiche della piattaforma, sarà necessario utilizzare le funzionalità di interfaccia C / C ++ specifiche di ciascuna piattaforma. Con iOS questo è abbastanza semplice in XCode poiché il compilatore (clang come menzionato sopra) supporta già C / C ++. Con Android è necessario utilizzare lechiamate NDK e marshall tra Java e C / C ++.


1
Ho esaminato il codice sorgente del Godot Engine. Sembra un po 'eccessivo; Preferirei crearne uno mio senza le funzionalità di cui non ho bisogno. Non sono del tutto sicuro di come farlo. Non sono stato ancora in grado di eseguire correttamente alcun codice C ++ su Android.
Craig Horwood,

hehe ... ya NDK non è un picnic. Sinceramente trovo qualsiasi cosa su Google che abbia bisogno di aiuto nella categoria di cordialità degli sviluppatori. Usi SDL off limits per te? Ho molte più informazioni con cui posso aggiornare la risposta, se necessario.
Matthew Sanders,

SDL non è vietato, ma preferirei non andarci. Ancora una volta, c'è sempre quella conoscenza assillante che avrebbe potuto essere fatto senza un framework.
Craig Horwood,

Sono costantemente morso da quell'insetto, quindi so come ti senti. Ho usato NDK in passato e non penso che molto sia cambiato nel modo di installazione e compilazione. Spero sicuramente che il debug sia migliorato poiché in passato dovevi utilizzare GDB direttamente tramite terminale e l'IDE non ne aveva il supporto, ma sembra che abbiano iniziato ad aggiungere il supporto NDK a Android Studio . Hai provato l' esempio ciaojni ?
Matthew Sanders,

L'NDK è una delle cose più disgustose esistenti, potresti trovare bgfx utile come riferimento github.com/bkaradzic/bgfx , non è così sottile come potresti pensare, ha più backend di rendering
JBeurer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.