Perché C / C ++ è preferito per gli sviluppatori di giochi?


14

Alcuni sostengono che offra maggiore controllo agli sviluppatori, ma cos'è esattamente che può essere controllato tramite C ++ che non può essere controllato usando, ad esempio, Java?

Risposte:


21

Java viene eseguito in una macchina virtuale, mentre C ++ viene eseguito direttamente sull'hardware. Ciò significa che hai un maggiore controllo su dove va la tua memoria e su ciò che viene fatto in C ++.

Java è un linguaggio spazzatura. Non hai il controllo diretto sulla tua memoria. È possibile allocare nuovi blocchi di memoria, ma non si ha il controllo (fine) su quando viene eliminato. Il garbage collector controlla ogni pezzo di memoria allocato per ogni x frame e determina se è spazzatura o è ancora in uso.

Per i giochi questo può essere disastroso. Ogni pochi frame arriva un garbage collector per controllare ogni singola allocazione che hai fatto per vedere se è ancora in uso? Parla di un rallentamento!

In secondo luogo, la maggior parte delle librerie che utilizziamo sono state scritte in C o in C ++. Sto parlando di Scaleform, motore fisico Havok, PhysX, SpeedTree, ecc. Tutti i pacchetti professionali, ampiamente utilizzati nel settore. Se un'altra lingua vuole essere re, è meglio supportarli.

La mia opinione personale è che Java è davvero bello per le applicazioni desktop e le app, ma non per i giochi. Java ha molti strumenti utili per gli sviluppatori e teoricamente può essere eseguito su qualsiasi piattaforma che abbia un'implementazione della Java Virtual Machine, ma preferisco ancora C ++ perché ho bisogno di quel controllo sulla mia memoria. Soprattutto quando si inizia a lavorare con strutture di dati esotici (albero rosso-nero, elenco doppiamente collegato, ecc.) Aiuta a mantenere una buona panoramica di tutte le allocazioni di memoria.

Non sto dicendo: non usare Java. Sto dicendo: pensa al motivo per cui stai usando Java. Minecraft è stato creato in Java, quindi è sicuramente possibile creare giochi in Java. Ma sarebbe stato un gioco migliore, se fosse stato creato in C ++? Beh, certamente non sarebbe stato così economico farlo funzionare sui tre grandi (Windows, MacOS, Linux), ma nonostante ciò, ha riscontrato un sacco di bug specifici della piattaforma nel suo sviluppo, bug che Java non ha potuto risolvere al di sopra di.

Ci sono tonnellate di framework C ++ ora per i programmatori principianti. Non ci sono davvero scuse per non impararlo, soprattutto se vuoi promuovere la tua carriera nel settore.


1
Solo un nitpick, ma nella maggior parte degli ambienti operativi il codice nativo viene eseguito in una macchina virtuale. Java viene eseguito in una macchina virtuale all'interno di una macchina virtuale.
Skyler Saleh,

1
@RTS: È un po 'complicato chiamare op -> traduzione micro-op una macchina virtuale, se è quello che stai arrivando.

No, stavo parlando della macchina virtuale in cui tutte le applicazioni vengono implementate dai moderni sistemi operativi per consentire un multitasking sicuro. Ciò si verifica su sistemi operativi eseguiti su architetture senza micro-operazioni (RISC). Ciò include la memoria virtuale, gli interrupt software, i sistemi per l'accesso simultaneo all'hardware, lo scheduler dei sistemi operativi e la gestione del file di registro.
Skyler Saleh,

@RTS Non sono sicuro che l'isolamento delle attività si qualifichi davvero come una VM. È un RM (Real Machine) con una certa protezione integrata. Non esiste un livello di astrazione delle istruzioni ovvio tra fetch / exec. Compilatori e linker generano un codice trasferibile come requisito. La CPU fornisce supporto hardware per gran parte di questo, il che rimuove l'aspetto "virtuale".
3Daveva il

2

Risposta breve: il C ++ viene compilato in codice nativo, quindi le prestazioni dipendono dallo sviluppatore, non da un runtime o da una VM.

Risposta lunga:

Il fatto che il C ++ sia "più veloce" non ha nulla a che fare con il C ++. Al momento, è una delle pochissime lingue disponibili supportata da strumenti che producono codice nativo autonomo per più piattaforme.

In passato, potresti usare C, C ++, BASIC / 2, Delphi, ecc. E ottenere eseguibili efficienti e indipendenti. La scelta della lingua era una questione di preferenze personali e forze di mercato.

In questi giorni, il presupposto che "C ++ è più veloce" è essenzialmente una profezia che si autoavvera, sebbene LLVM sia in una buona posizione per cambiarlo poiché fa tutto ciò che accade nel parser, come una volta.

Borland aveva ragione: più lingue che venivano analizzate, prima venivano applicate le ottimizzazioni, poi passate a un compilatore e linker backend comuni. Che è effettivamente uno dei maggiori successi di LLVM.

Java è strutturato in modo tale che sarebbe molto difficile implementarlo senza JVM. Stranamente, C #, comunemente e in modo errato, si presume approssimativamente equivalente a Java, si compila già in codice nativo su diverse piattaforme, incluso iOS.

In cima alla mia lista di Natale? Una macchina del tempo per tornare indietro e aggiungere proprietà, gestione delle eccezioni reali e vero polimorfismo WORKING al C ++, e sbarazzarsi della merda della sintassi della freccia in alto che il parser può capire da solo. Ho scritto un preprocessore per quei 10 anni fa perché è stupidamente stupido.


Intendi l'accesso indiretto dei membri (come in h-> x)? La rimozione che renderebbe i tipi di handle e puntatore intelligente molto meno utili. Se si discute di cambiarlo solo per puntatori non elaborati, si è semplicemente reso la lingua meno coerente.
Lars Viklund,

1
Cosa non funziona del polimorfismo del C ++?
Casey,

@LarsViklund sì, questo è ciò che intendo. Ma mentre l'indirizzo, la dereference e gli operatori membri (&, *, ::, -> ...) hanno tutti significati diversi, il più delle volte è possibile inferire il risultato drsjted dal contesto. Le cose avrebbero potuto essere semplificate in anticipo, come avviene in altre lingue. Un piccolo punto critico, ma che ha il potenziale per aumentare la complessità del codice (e quindi sviluppare tempi e costi).
3Daveva il
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.