Java è una buona scelta per i giochi multipiattaforma? [chiuso]


13

Sto cercando di creare un gioco in Java e vorrei che funzionasse su Windows, Linux e Mac. Sono abbastanza sicuro che C # sia una cattiva scelta per questo, e non ho abbastanza esperienza in C o C ++. Voglio stare lontano da Flash. Pertanto, Java è una buona scelta per me? Principalmente, uso C # e penso che Java sia simile, quindi presumo che non sarà così difficile da imparare. Ma è abbastanza veloce? Esiste un linguaggio più adatto alle mie esigenze rispetto a Java?


8
Dipende dallo stile di gioco che stai cercando di fare. A seconda dello stile desiderato potrebbe essere che HTML5 e alcuni javascript funzionino per te, se non Java.
Patrick Hughes,

Oddlab vende giochi basati su Java, ad esempio Tribal Trouble. Puoi vedere i dettagli del loro motore su oddlabs.com/technology.php

5
Minecraft è un ottimo esempio di gioco multipiattaforma scritto in Java. Quando il nostro ragazzo incontra i suoi amici per una seria sessione di Minecraft, ci gioca su OSX, Windows e Linux.
Kev,

Due anni dopo, C # ora è abbastanza buono per queste cose con l'aiuto del motore Unity e / o Monogame, entrambi i quali supportano anche iOS, Android e WP8.
Magus

Risposte:


28

Java è estremamente adatto per la scrittura di giochi multipiattaforma. Vantaggi principali:

  • Portabilità : in generale, è possibile scrivere un gioco Java e aspettarsi che funzioni invariato sulla maggior parte delle piattaforme. È probabilmente l'opzione più portatile di qualsiasi lingua: C / C ++ è l'altra opzione altamente portatile ma deve essere ricompilata per ogni piattaforma e in molti casi le librerie hanno funzionalità specifiche della piattaforma che limitano la portabilità.
  • Prestazioni : il codice Java, se scritto bene, funzionerà praticamente come qualsiasi altro linguaggio, incluso C / C ++. Il compilatore JVM JIT è estremamente buono. Puoi scrivere un gioco di successo di alta qualità in Java (Minecraft, ad esempio).
  • Librerie : esiste una vasta gamma di librerie disponibili per Java che coprono quasi tutte le funzionalità che potresti desiderare nei giochi, dalla rete alla grafica, dal suono all'AI. La maggior parte delle librerie Java sono open source.

La decisione principale che dovrai prendere è quale framework GUI utilizzerai. Esistono diverse opzioni, ma le più importanti sono:

  • jMonkeyEngine - motore 3D a tutti gli effetti. Se vuoi creare un gioco 3D, questa è probabilmente la tua scelta migliore: contiene molte funzioni del motore di gioco come grafici di scene, generazione del terreno, ecc.
  • LWJGL - una libreria di livello inferiore con accesso diretto a OpenGL. Probabilmente ti piacerà se desideri le massime prestazioni e non ti dispiace scrivere molto del tuo motore da zero.
  • Swing : ha il vantaggio di essere estremamente portatile ed è incluso nel runtime Java, quindi non ha bisogno di una dipendenza aggiuntiva. È buono per i giochi 2D ad alta intensità grafica (giochi di strategia, giochi di carte ecc.)
  • Slick - una libreria di giochi 2D basata su LWJGL. Probabilmente buono se vuoi scrivere un gioco 2D ma hai ancora bisogno di buone prestazioni grafiche (sparatutto, giochi con piattaforma a scorrimento ecc.)
  • JavaFX - progettato per ricche applicazioni Internet, più o meno come Flash. Ha molte funzioni interessanti che andrebbero bene per i giochi anche se non l'ho ancora visto usato molto. JavaFX 2.0 in particolare sembra abbastanza promettente.

I principali svantaggi di Java per i giochi sono proprio i "casi limite" che probabilmente non ti influenzeranno ma sono rilevanti per alcune classi di gioco:

  • Disponibilità del motore 3D - anche se gli strumenti e i motori sopra elencati sono buoni, non sono ancora all'altezza del livello dei motori C / C ++ come l'Unreal Engine utilizzato dalle società di gioco professionali. Quindi Java probabilmente non sarà la tua prima scelta se stai cercando di sviluppare un importante FPS con un budget multimilionario - C / C ++ vince ancora qui.
  • Latenza GC La raccolta dati obsoleti di Java è nel complesso un enorme vantaggio, ma può causare lievi pause quando si verificano i cicli GC. Questo sta migliorando molto con le nuove JVM a bassa latenza, ma può ancora essere un problema per i giochi con requisiti di latenza molto bassi (forse sparatutto in prima persona). Una soluzione alternativa consiste nell'utilizzare librerie a bassa latenza come http://javolution.org/ , tuttavia queste sembrano essere rivolte più al trading ad alta frequenza o ai sistemi in tempo reale piuttosto che ai giochi.
  • Mancanza di capacità di sfruttare ottimizzazioni di basso livello - mentre il compilatore JIT Java è incredibilmente buono, impone comunque alcuni vincoli che non è possibile evitare (controllo dei limiti sugli array, ad esempio). Se hai davvero bisogno di ottenere l'accesso a livello di codice macchina nativo per ottimizzare questo tipo di cose, probabilmente preferirai C / C ++ su Java.

Si noti che ci sono anche alcune opzioni di distribuzione da considerare:

  • Applet : viene eseguito in un browser, molto comodo per gli utenti, tuttavia le applet sono piuttosto limitate in ciò che possono fare per motivi di sicurezza. Si noti che è possibile firmare applet per ottenere privilegi di sicurezza aggiuntivi, sebbene ciò causerà un prompt leggermente spaventoso per la maggior parte degli utenti.
  • Java Web Start : migliore per giochi più sofisticati che richiedono un download locale completo e che devono anche accedere alle risorse di sistema locali. Funziona anche in modo abbastanza indipendente dalla piattaforma. Probabilmente il percorso migliore per un gioco di medie dimensioni o qualcosa che deve sfuggire alle restrizioni di sicurezza dell'applet.
  • Download del programma di installazione : è possibile scrivere un programma di installazione per un gioco Java come si farebbe con qualsiasi altra lingua. Ovviamente è un po 'più complicato configurare e testare, poiché gli installatori tendono ad avere alcune funzionalità specifiche della piattaforma.
  • Web : è possibile scrivere un'applicazione Web HTML5 e sfruttare la forza di Java esclusivamente sul lato server. Vale la pena considerare per un gioco web multiplayer.

Infine, vale anche la pena considerare alcuni degli altri linguaggi JVM: questi hanno tutti i vantaggi della piattaforma Java sopra elencata, ma alcuni li considerano come linguaggi migliori di Java stesso. Scala, Clojure e Groovy sarebbero i più importanti e tutti potranno utilizzare gli strumenti e le librerie Java sopra elencati.


1
JWS non aggiunge molto alle applet oltre a separare l'app dal browser. In entrambi i casi penso che vorrai firmare il tuo codice se stai usando una libreria OpenGL.
Peter Taylor,

2
Direi che l'accesso al sistema locale è molto "molto" rispetto alle restrizioni delle applet per molti giochi seri, specialmente multiplayer. HTML5 è pulito, ma è ancora un piccolo babby con supporto spotty e bit importanti come GL e Socket disattivati ​​su molti browser, inoltre l'audio non è ancora adatto per l'uso del gioco.
Patrick Hughes,

1
@PatrickHughes, se vuoi che l'accesso al sistema locale da JWS senza grandi finestre di dialogo spaventose dovrai firmare il tuo codice - e un'applet firmata di solito avrà anche accesso al sistema locale.
Peter Taylor,

Puoi anche usare Inno Setup per distribuire i tuoi giochi Java.
Mahmoud Hossam,

1
Puoi aggiungere LIBGDX all'elenco dei pacchetti che ti aiutano a scrivere il tuo motore; ha configurazioni e ottimizzazioni JNI per varie piattaforme e persino Android e fino a OpenGL ES.
Patrick Hughes,

4

Minecraft e Blocks that Matter sono entrambi realizzati in Java, quindi sì, è molto utile per creare giochi. Il problema principale che si verificherà durante l'utilizzo di Java è il porting su piattaforme mobili se si sceglie di seguire tale percorso e scrivere un'app nativa. Android è una specie di Java SE con una libreria separata. RIM's Blackberry utilizza Java ME. In teoria iOS può essere programmato con Java sebbene Objective-C sia probabilmente una scelta migliore per quella piattaforma.

Java è abbastanza simile a C #. Trovo spesso comprensibile il codice C # nonostante conosca solo Java. Hanno una diversa filosofia di design, ma per quanto ampiamente dispiegabili con il minimo fastidio si adattano entrambi al conto. C # non è una scelta terribile per i giochi di qualsiasi tipo, anche se la tua distribuzione mobile sarà più difficile e la distribuzione su piattaforme non Windows richiederà più tempo o difficoltà a seconda di quali specifiche librerie esterne e così via.


1
Java su cellulare: compilare una volta, eseguire il debug ovunque: '(.
deadalnix,

0

Il modo più ovvio e meno resistente è usare la combinazione HTML5 + javascript. Qualsiasi applicazione o gioco creato utilizzando questo verrà eseguito su quasi tutti i dispositivi e browser.

Vantaggio : - Non avrai bisogno di alcuna configurazione per far funzionare il tuo gioco su varie piattaforme e dispositivi.

NOTA: - Ho visto pochi giochi che sono stati creati utilizzando le suddette tecnologie ma erano di statura inferiore. Ma suppongo che se si può produrre burro dal latte, il formaggio non è impossibile


0

Puoi usare Scala e Scheme Bigloo su Eclipse per usare JVM per codice stressato o azione parallela all'interno del tuo gioco Java.

Con Pattern Design e UML2, puoi anche proteggere il codice con OCL, tutto è in Topcased.org.

Padroneggiare questi strumenti richiede tempo, ma sono lo sfondo di Java, la base che ti spingerà in alto.


-10

Risposta breve: no.

Java non genera un eseguibile binario, ma solo bytecode come fa C # (CLI), e questo non è una buona cosa per le aziende serie in "ambienti aperti" per due motivi principali:

  • la probabilità di rimanere intrappolati nell'ingegneria inversa è molto alta, specialmente con linguaggi vecchi e molto conosciuti come Java
  • non hai il pieno controllo delle prestazioni della macchina, nel caso di Java la JVM gioca un ruolo importante assumendo il pieno controllo.

Naturalmente ogni lingua ha le sue librerie, ma a causa della grande quantità di esse per ogni lingua, questo non è un vero problema e non credo sia lo scopo di questo argomento.

Forse a livello professionale puoi trovare qualcosa che può infrangere la regola come un dev-Kit in grado di tradurre tutte le istruzioni C # in codice assembly per una macchina del mondo reale, ma se questo tipo di approccio non è nelle carte che sei praticamente costretto a considera solo la C e la C ++ per il tuo sviluppo quando miri a vendere il tuo prodotto in un ambiente aperto.

Le cose sono un po 'diverse per i dispositivi mobili perché sono "ambienti chiusi" anche Android è praticamente chiuso considerando il fatto che la fonte delle ROM del mondo reale di solito non sono disponibili al pubblico, Android può essere considerato open source ma il 99 % delle ROM sui dispositivi attuali non lo sono. In questi casi non puoi discutere troppo, tutto è già pronto per te e ogni piattaforma ha il suo linguaggio come tutti sanno.

Alla fine, se hai intenzione di vendere questi prodotti in ambienti aperti, posso solo suggerire lingue in grado di produrre codice compilato e binario / assembly, in ambienti chiusi la decisione è tipicamente più facile da fare per diversi motivi.


7
Sembra che credi che i binari compilati siano più difficili da decodificare rispetto ai binari bytecode. Potrebbe esserci un po 'di verità in questo, ma non molto. In effetti, probabilmente più persone possono lavorare con il disassemblatore x86 e x64 che con il CLI o il bytecode Java e rimarrai stupito di quanto possa essere utile uno strumento come IDA Pro (dichiarazione di non responsabilità - non lo uso dalla versione gratuita da parecchi anni fa - probabilmente è ancora più facile ora). Un file bytecode offuscato può essere persino più difficile da decodificare e, in ogni caso, la maggior parte delle persone avrà poche ragioni per preoccuparsene.
Steve314,

2
Perché pochi motivi per preoccuparsene? Bene, quante persone scrivono i propri motori di gioco proprietari di basso livello? E anche se lo fai, quali sono le probabilità che qualcuno preferisca rubare il tuo (bisogno di ingegneria inversa, mancanza di qualsiasi tipo di documentazione, ecc. - un sacco di tempo sprecato lì, indipendentemente dal linguaggio di sviluppo) piuttosto che usare legalmente un motore open source gratuito ben documentato? La pirateria dell'intero programma è una preoccupazione molto più probabile del reverse engineering per rubare idee di codice, e i pirati non sembrano minimamente scoraggiati dal codice compilato nativo.
Steve314,

1
A livello di astrazione, le istruzioni JVM sono di livello estremamente basso, non esattamente come nell'hardware, ma sostanzialmente lontane dall'astrazione a livello di applicazione. Dove i livelli di astrazione contano nelle librerie Java standard, il che significa che ci sono davvero pochi livelli tra la piattaforma e l'applicazione finale. Tranne che ciò accade normalmente in C e C ++ (perché reinventare libpng ecc.) - la maggior parte delle persone utilizzerà librerie comuni che formano effettivamente un insieme di piattaforme ampiamente conosciute e buoni strumenti di reverse engineering possono riconoscerle.
Steve314,

3
Per soddisfare i requisiti tutto il codice dovrebbe essere spedito su FPGA e racchiuso in resina epossidica. Sorprendenti, anche i pacchetti di chip black-box possono e sono retroingegnerizzati continuamente. Quindi anche potenti giganti come Intel introducono bug nei loro pacchetti CPU in modo che la tua scatola nera hardware epossidica incorporata continuerà a soffrire di esposizione alle librerie hardware. Finalmente la chiamata alla sicurezza per oscurità, che non funziona. Reductio ad absurdum, lo so, ma lo è anche la risposta originale.
Patrick Hughes,

3
Sfortunatamente non ho la reputazione sufficiente per sottovalutarti. Tutti i tuoi argomenti sono falliti. Ci sono persone là fuori che decodificano, decompilano e hackerano i giochi prodotti in C, C ++ o in qualsiasi linguaggio, quindi essere un pacchetto binario non fornirà molta sicurezza aggiuntiva. Inoltre, se l'OP è preoccupato per questo, ci sono molti ottimi offuscatori di java là fuori. Per quanto riguarda il pieno controllo delle prestazioni della macchina, la maggior parte dei programmatori C e C ++ non ha nemmeno questo, basta scrivere un buon codice e il compilatore ottimizzerà ciò che è necessario. E anche se questo è un problema, potresti usare JNI o ​​JNA.
Victor Stafusa,
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.