Come posso eseguire su più piattaforme utilizzando un motore personalizzato?


13

I motori di gioco come Unity e Unreal possono funzionare su piattaforme multiple. Mi chiedo come fanno.

Ho usato C ++ e OpenGL per un po ', e quello che sto cercando sono le risorse per integrare qualcosa che mi permetterà di correre su piattaforme diverse senza riscrivere. Qualcosa come LibGDX in cui si scrive il codice utilizzando un'API di base e quindi l'API lo converte in HTML, Android, iOS, eccetera. Sono consapevole di poter usare un altro motore invece di scrivere il mio ma sono interessato all'esperienza di apprendimento.

Risposte:


26

Porta il tuo motore su ogni piattaforma. Non c'è niente di speciale al riguardo. Se hai un codice che è solo Windows, aggiungi una logica #ifdef nel file o aggiungi un secondo file (così avresti FooWindows.cppe FooLinux.cppqualsiasi cosa) che implementa quella funzionalità sugli altri sistemi operativi che ti interessano .

Le cose di pubblicazione con un clic che un motore come Unity ha sono consentite perché Unity stesso non viene mai modificato dall'utente finale. Stai solo scrivendo script e dati, quindi il motore ha binari predefiniti per tutte le piattaforme e il pulsante di pubblicazione raggruppa semplicemente quei binari insieme ai dati.

Altri motori si basano su sistemi di compilazione e cross-compilatori per creare il gioco compilato quando necessario, proprio come faresti con qualsiasi applicazione multipiattaforma non di gioco.

Per cose come HTML5, ci sono strumenti come emscripten che possono compilare un'applicazione C ++ da eseguire in JavaScript. Fondamentalmente devi solo creare un'altra porta del tuo motore per emscripten (poiché non può usare alcuna libreria / funzione C ++ arbitraria).

Non devi riscrivere l'intero gioco, ma dovrai sicuramente fare molto lavoro di sviluppo, codifica e porting per ogni nuova piattaforma che desideri supportare.


14
Nella mia esperienza di lavoro con il software multipiattaforma (il più grande progetto sarebbe HotSpot), vuoi davvero evitare di far passare ifdefs attraverso il codice. È sicuramente meglio avere qualcosa di simile share/os/<linux>(o share/cpu/x86) e inserire tutto il codice specifico della piattaforma e quindi includere inclusioni condizionali. Questo è almeno ciò che fanno gcc, HotSpot e il kernel Linux (non una regola difficile certamente). Sì, potresti iniziare con una sola funzione dipendente dalla piattaforma e pensare che sia eccessivo, ma non rimane mai così e altrimenti diventa rapidamente un casino.
Voo,

14

Non c'è proiettile magico qui. Se vuoi che il tuo gioco funzioni su più piattaforme, devi scrivere codice per più piattaforme (o sfruttare le librerie di terze parti che già lo fanno per te).

Le cose che stai chiedendo non si allineano: dici (enfatizza il mio)

quello che sto cercando sono le risorse per integrare qualcosa che mi permetterà di correre su piattaforme diverse senza riscrivere

ma anche quello (enfatizzare di nuovo il mio)

Sono consapevole di poter usare un altro motore invece di scrivere il mio ma sono interessato all'esperienza di apprendimento .

Dovrai praticamente fare l'uno o l'altro: scegli di utilizzare una libreria, un motore e / o una toolchain di terze parti che ti forniscano supporto multipiattaforma o crearne uno tuo scrivendo codice multipiattaforma (progettando il tuo propria astrazione sulle piattaforme a tua disposizione e implementazione di tale astrazione per ciascuna piattaforma).

Motori di gioco come Unreal o Unity che supportano questa sia ricompilare il codice contro l'appropriato di astrazione della piattaforma, o si richiede di costruire una libreria o DLL contro i loro API interne, che caricano da una piattaforma specifica eseguibile conducente che essi hanno compilato per l'appropriato piattaforma.


2

Contrariamente alle altre due risposte (che sono giustamente specifiche per C ++), esiste un altro modo. Alcune architetture che mi vengono in mente:

  • Porta il tuo motore: modifica o scrivi il codice in modo che funzioni su più piattaforme. Questo è affrontato nelle risposte sopra.
  • Scrivi qualcosa sopra una libreria multipiattaforma: questo è l'esempio di libGDX, che gira su Java. Java funziona su desktop, Android e iOS (tramite RoboVM). Usando qualcosa come Java, ottieni il vantaggio di piattaforme aggiuntive gratuite quando la libreria / strumento sottostante le supporta. In questo caso, quando è uscito RoboVM, libGDX (quasi) "funziona" su iOS.
  • Scrivi un generatore di codice: questo è l'approccio di Haxe e di altri strumenti. Hai un linguaggio di base (es. Haxe / AS3) e scrivi convertitori che generano output per altre lingue. Per esempio. Haxe si converte in C ++ per desktop, Java (credo) per Android, ecc.

Personalmente, trovo che l'approccio di libGDX sia il più semplice: trova una lingua o una piattaforma che soddisfi le tue esigenze e scrivi in ​​cima. La generazione di codice e i motori portatili sono complessi e difficili da scrivere bene.

libGDX è in realtà un'ottima scelta, poiché colpisce sia i principali telefoni cellulari, desktop e web (tramite applet o il compilatore web di Google).


Anche con Java o C #, non ottieni magicamente il codice multipiattaforma; devi comunque conoscere le librerie di terze parti che potrebbero avere dipendenze dalla piattaforma (ad esempio, SlimDX o SharpDX sarebbero una scelta sbagliata per un progetto C # multipiattaforma).

@JoshPetrie ottieni sicuramente molto "gratis" rispetto al rotolamento del tuo motore C ++ e al porting su piattaforme diverse.
ashes999,

@ ashes999 grazie per la risposta, libGDX è geniale Lo uso ma lo scrivo in modo che funzioni su più piattaforme quindi uso CMake, ci sono più per la sfida che usare una libreria o un motore preesistenti
DanielCollier,

2

Al momento sto costruendo un motore di gioco multipiattaforma. Sto usando SDL, che è una libreria multipiattaforma eccellente (e adeguatamente di basso livello) per la creazione di applicazioni grafiche, per alleviare il dolore.

Oltre a questo, però, c'è un sacco di "codice personalizzato" per ogni piattaforma. Questo devi solo superare. Ho trovato finora una piccola parte del mio tempo di sviluppo, per lo più passato a cercare documenti per sistemi che non conosco come il mio Linux nativo.

Ti scoraggerei dall'usare #ifdef ovunque in tutto il codice. Invece, crea astrazioni attorno alle primitive chiave (un esempio di tale primitiva potrebbe essere un socket TCP).

Quando incontri un nuovo problema che richiede soluzioni diverse per ambiente, chiediti "posso risolvere questo problema usando solo le primitive multipiattaforma che ho già costruito?" Se la risposta è sì: voilà, semplice codice multipiattaforma. Altrimenti, scopri quali primitivi ti mancano e implementali.


0

Se vuoi fare questo "da zero" come esperienza di apprendimento, allora devi usare l'API Win32 dove puoi trovare informazioni sull'apertura di una finestra e un contesto OpenGL su MSDN e sul wiki OpenGL ( http: // www .opengl.org / wiki / Created_an_OpenGL_Context_ (WGL) ). Per Linux ottenere una copia di seconda mano del Manuale di programmazione O'Reilly Xlib e del Manuale di riferimento Xlib e leggere anche su GLX (estensione OpenGL del sistema X Window). Vedi anche http://www.opengl.org/wiki/Tutorial:_OpenGL_3.0_Context_Creation_(GLX)

Quindi devi solo fornire la stessa API alla tua applicazione con funzioni che facciano la stessa cosa (es. Aprire una finestra) ma abbiano implementazioni diverse per ogni piattaforma. Riscrivi parti del tuo motore per piattaforme diverse. Quindi un gioco che scrivi usando il motore devi solo scrivere una volta ma funzionerà su piattaforme diverse.


grazie per la risposta, ma preferirei semplicemente usare SDL2 per finestre, la sua piattaforma multipiattaforma e molto facile da usare. come LibGDX usa LWJGL per finestre
DanielCollier,
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.