È ragionevole scrivere un motore di gioco in C? [chiuso]

Chiuso . Questa domanda è basata su opinioni . Attualmente non accetta risposte.

Commenti

  • I giochi per console usano c ++ FYI!
  • In realtà penso che C sarebbe più facile scrivere giochi fino a una certa scala, diciamo decine di migliaia di LOC o giù di lì, principalmente perché ti consente di concentrarti solo su bit e byte senza tipi di dati complessi e si costruisce super veloce rispetto a C ++. Ma dopo una certa scala (ad esempio raggiungendo centinaia di migliaia di LOC), ' inizierei a voler raggiungere C ++ dove ' d iniziare effettivamente a volere tipi di dati complessi, maggiore sicurezza dei tipi, possibilmente eccezioni, modelli e andare su scala ancora più grande (diciamo milioni), per cose diverse dal C ++ da combinare con il codice C e C ++.
  • C ha anche il vantaggio aggiuntivo di essere ampiamente portabile anche per ABI, quindi diventa abbastanza facile prendere il codice C esistente e quindi iniziare a usarlo in altri linguaggi, ad esempio, da un FFI. Il C ++ è un po più imbarazzante con la manipolazione dei nomi, lincapacità di lanciare in sicurezza i confini dei moduli, i rappresentanti di vtable non sono gli stessi tra i compilatori, le implementazioni delle librerie standard che differiscono tra i fornitori, ecc. andare fuori moda, anche se ci vuole più tempo per scrivere qualcosa di scala con esso.

Risposta

Tuttavia, scrivere un intero motore di gioco in C oggi sarebbe irragionevole?

È ragionevole, ma il la domanda è cosa ti fa comprare? Probabilmente non hai bisogno dellestrema portabilità offerta da C, ed è “un peccato rinunciare a tutte le funzionalità offerte da C ++ a meno che tu non sia davvero filosoficamente contrario.

Quali sono, se ce ne sono, alcuni vantaggi che C ha su C ++?

Miglior tempo di compilazione?

Perché qualcuno dovrebbe posare vuoi senzaltro usare C su C ++?

Penso che sia principalmente una scelta estetica. A molte persone piace il C perché è semplice, minimale e pulito. Il C ++ ha molte caratteristiche interessanti (i soli spazi dei nomi lo rendono utile), ma è anche grande e disordinato.

Commenti

  • Until Id Tech 4
  • @Josh: più facile eseguire il debug !? I programmi C sono notoriamente difficili da eseguire il debug, in gran parte a causa dei puntatori e della gestione della memoria. I programmi C ++ (quando si usano veri idiomi di programmazione C ++, che tendono a evitare i puntatori e la gestione della memoria quando possibile) sono diversi ordini di grandezza più facili da eseguire il debug.
  • C può essere compreso da semplici mortali. Il C ++ sembra avere molte funzionalità e casi limite che i programmatori esperti apprendono anche dopo un decennio di utilizzarlo ogni giorno per vivere.
  • Il C ++ è un grande linguaggio, ma ' è diffusa principalmente da persone che ' hanno appena letto storie dellorrore e non ' si sono prese il tempo per impararle . Cè molto da imparare, ma in cambio ottieni molto valore. Il C ++ ti consente di esprimere molte cose che il C può semplicemente ' t.
  • @ BlueRaja-DannyPflughoeft #define malloc(x) my_malloc(x) #define free(x) my_free(x) e ora stai eseguendo il debug della memoria. Con C ++ non sai mai cosa verrà allocato e quando, perché ci sono tanti modi per allocare memoria (nuovo, malloc, costruttori di classi, ecc.)

Risposta

Ho lavorato a lungo con un motore di gioco in C puro che ha distribuito diversi prodotti, quindi è assolutamente possibile. Ecco la mia esperienza personale con il lavoro in entrambi i motori C e C ++:

  1. Lutilizzo di strutture in C puro ti consente di trarre vantaggio dalla conoscenza dellallineamento delle strutture e puoi quindi utilizzare queste informazioni per costruire i livelli di persistenza e serializzazione degli oggetti. Il motore con cui ho lavorato aveva alcuni semplici parser di intestazione che creavano automaticamente questi metadati sulle strutture e rendeva banali alcuni tipi di operazioni sui dati. Lanalisi di file di intestazione C ++ arbitrari è essenzialmente impossibile, e non appena man mano che si aggiungono ereditarietà e funzioni virtuali si perde la capacità di sapere esattamente dove si trovano le cose in memoria
  2. Il tempo di compilazione è notevolmente più breve perché è possibile mantenere i file di intestazione molto compatti e sfruttare le dichiarazioni anticipate di strutture.
  3. Il debug può essere migliorato perché senza luso di modelli ed ereditarietà è molto facile capire esattamente cosè un determinato oggetto e cosa sta facendo.

Tutti questi vantaggi potrebbero essere ottenuti altrettanto facilmente utilizzando un codice c ++ limitato che si astiene dallutilizzare modelli ed ereditarietà su oggetti serializzati, ma è stata la decisione del CTO che sarebbe stato più facile per rafforzare la semplicità se gli elementi più confusi di C ++ non fossero disponibili.

Personalmente penso che questo fosse leggermente estremo, poiché mi mancava davvero la capacità di dichiarare in modo corretto le variabili nei cicli for e i molti usi completamente legittimi di eredità. Ma alla fine tutto sommato non ci è costata molta produttività

Commenti

  • Ecco ' non è proprio nulla che ti impedisca di implementare lereditarietà in C. E se usi C99 puoi dichiarare variabili nei cicli for.
  • Non sono daccordo con il punto 3. ' è facile scrivere codice disordinato e difficile da eseguire il debug in C come lo è in C ++. Un debug migliore non è ' t qualcosa di inerente al linguaggio C.
  • Anche il codice pulito può essere più difficile da capire in C ++, con sovraccarico, modelli, funzioni virtuali e eccezioni, è ' molto più difficile vedere a colpo docchio quale sarà leffettivo flusso di controllo.
  • @Dan: Semplicemente avendo più cose, C ++ è più difficile da eseguire il debug. Ovviamente puoi limitarti a usare qualsiasi di queste cose, nel qual caso il debug diventa facile come C, perché diventa C.
  • Meno cose è in realtà il motivo per cui mi piace C. Ad esempio, in CI può semplicemente copiare bit e byte con un memcpy per qualsiasi cosa perché il sistema di tipi non ' t consente cose come copiare ctor e dtor . Posso scrivere codice sapendo che non ho ' dover annullare gli effetti collaterali in quasi tutte le righe di codice dato che posso ' implicitamente uscire da una funzione a meno che non ne esca esplicitamente; non ci sono eccezioni che vengono lanciate. Tutto ciò rende la scrittura di strutture dati molto più semplice: in C ++ la semplice scrittura di un vector conforme allo standard richiede molto tempo, soprattutto se si vuole farlo …

Risposta

Sto riscrivendo un motore di gioco 2D scritto in C ++ e Lua in C e Lua. Finora lesperienza è stata abbastanza buona. Ovviamente eseguire operazioni su vettori e matrici non è così bello in C. Ma a parte questo ho trovato lesperienza piuttosto rinfrescante dopo aver trascorso più di 10 anni come sviluppatore C ++.

C ha un certo numero di vantaggi rispetto a C ++:

  1. Il compilatore si assicurerà che nessun codice venga eseguito al momento dellinizializzazione statica. Ciò rende completamente sicuro allocare staticamente dati globali come stringhe usate come chiavi, ad esempio
  2. Trasparenza. In C lassegnazione, lallocazione o la definizione di una variabile non causerà lesecuzione di carichi di codice. C ++ genererà automaticamente i costruttori di copia, quindi avrai meno controllo su ciò che viene eseguito durante lassegnazione.
  3. Un sacco di debug può essere più facile perché non vengono alterati i nomi delle funzioni
  4. È di solito va bene usare memcpy in C, ma causerà facilmente problemi in C ++, perché i costruttori di copia non verranno eseguiti. tha t memcpy è molto più veloce di std :: copy che conta.

Oltre a questo ci sono una serie di vantaggi nellentrare nel modo di pensare C. In C ++ mi ritrovo spesso a fare cose un po troppo generalizzate e astratte. In C di solito elimino cose come i metodi get-set e spesso prealloco array di dimensioni fisse piuttosto che usare array dinamici. Spesso mi ritrovo con codice più breve e più facilmente debug in C. Le strutture dati sono generalmente più piatte e più facili da visualizzare in un debugger.

Per essere onesti, non farei mai unapp esclusivamente in C. Il motivo funziona che lo combino con un linguaggio di livello superiore come Lua che può integrare molto bene C, se C non è così forte.

Il software Id scrive la maggior parte dei loro motori in CI, credo, puoi guardare Ritorno al castello Wolfenstein , scritto in C.

Ho scritto di alcune delle mie esperienze su scalabilità di C rispetto a C ++ e aspetti negativi del vettore STL rispetto agli array semplici.

Commenti

  • Cordiali saluti, in ogni caso ' ho controllato (che è, credo, darwin gcc e vc2008), std :: copy basta compilare una chiamata a memcpy se entrambi i tipi sono POD.
  • Inoltre, RE: STL vector vs plain array, perché non usare le belle parti di vecto r e usi normali puntatori C invece di iteratori se non ti piacciono '? Puoi semplicemente eseguire & myvector [N].' è il migliore dei due mondi, supponendo che il codice C faccia lallocazione della memoria allo stesso modo. Oppure, in for loop, controlla BOOST_FOREACH. Lo rende ancora più semplice di C.
  • Grazie per il suggerimento su std :: copy memcpy. Non lo ' lo sapevo. Quando Alexandrescu lo trattò alcuni anni fa, non era così. Informazioni sugli iteratori C ++. Riguarda principalmente la filosofia, cerco di programmare come il C ++ dovrebbe essere programmato sia per il bene delle persone con cui lavoro sia per trarre vantaggio dalle funzionalità del C ++. È stato fatto principalmente per sottolineare che alcuni miglioramenti C ++ come i contenitori STL non sono sempre migliori rispetto a farlo nel vecchio modo C.

Risposta

Come qualcun altro ha sottolineato, il C ++ porta il vantaggio di grandi spalle su cui puoi stare in piedi (BOOST, STL ecc.). Alla fine, è una scelta personale, ma sceglierei C ++ per via delle risorse disponibili. Se ci sono funzionalità in C ++ che non desideri utilizzare, non utilizzarle.

Commenti

  • Nota che il 99% di i motori di gioco commerciali e interni si allontanano da Boost e STL per vari motivi (garanzia delle prestazioni, debug, sicurezza dei thread, controllo).
  • E il 99% delle statistiche è costituito.
  • Penso che dovrebbe essere una specie di regola citare tutte le statistiche.

Risposta

Io no ” Non credo che qualcuno usi esclusivamente C in questi giorni, di solito è mescolato con un linguaggio di livello superiore.

La programmazione in C ha alcuni vantaggi rispetto, ad esempio, alla programmazione in C ++. C ++ può fare molte cose nascoste che sono invisibili allutente, il che può danneggiare le prestazioni se non stai attento. C ++ può anche essere terribile quando si tratta di utilizzo della cache, che di nuovo può danneggiare le tue prestazioni.

Quindi potrebbe portare alcuni vantaggi scrivere le parti critiche per le prestazioni di un gioco in un modo simile al C, piuttosto che nel modo tradizionale C ++. non ho mai sentito parlare di nessuno, negli ultimi anni, che abbia effettivamente scritto un intero gioco in C.

Su alcune piattaforme, come liPhone, luso di C ++ può aumentare la dimensione del tuo eseguibile con una certa porzione di kilobyte (ho dimenticato come molto, mi dispiace), motivo per cui alcuni sviluppatori di iPhone scelgono di scrivere il loro codice in un mix di C e Objective-C.

Answer

Ti darò un paio di ragioni in più per cui sarebbe irragionevole scrivere un motore di gioco in C invece che in C ++ oggi: STL e BOOST.

Non riesco a immaginare come sarebbe vale la pena scrivere un altro list impleme ntazione quando puoi fare affidamento su codice che funziona fuori dagli schemi (e che non devi scrivere!)

Commenti

  • Fa qualcosa il grande studio usa effettivamente boost? Anche lutilizzo di STL è ancora in discussione, a causa della portabilità. Almeno per i motori di console.
  • Personalmente, ' utilizzo Boost.FunctionTypes per linterazione c ++ / lua (vedi gamedev.net/reference/programming/features/CPPLuaExport/ … ) e la libreria di numeri casuali Boost per la generazione di numeri casuali uniformi (per sistemi di particelle). Inoltre, Boost.Foreach è pulito. A proposito, a chi importa se i grandi studi non utilizzano BOOST? Hanno la forza lavoro per scrivere le proprie librerie STL da zero, io non ' t.
  • Sì, ma mi rendo anche conto che ' anche le librerie simili per C.
  • Molte persone usano boost nei giochi, credo. Ma ' è tuttaltro che un requisito (o addirittura auspicabile) per molti di noi.
  • Persone, ciò che credi è irrilevante : o conosci o non ' non lo sai .

Risposta

Scrivere un motore di gioco in C è ragionevole. È veloce e può essere portato su più sistemi. Ad esempio potresti usarlo per Android (con luso di NDK). Potresti usarlo per iPhone (Objective c è solo unestensione di c). Potresti anche usare esso per e dei principali sistemi operativi come Linux, Mac o Windows. Se ti senti a tuo agio con c, ti consiglio di provarlo!

Risposta

Ovviamente è ragionevole. Personalmente non lo farei, e la maggior parte dei fan di C che conosco in realtà scrive solo codice tipo C in file .cpp. Ma i linguaggi sono abbastanza simili a dove non importa.

Per quanto riguarda il motivo per cui qualcuno dovrebbe scegliere di farlo, penso che sia principalmente dovuto alla filosofia anti-C ++. Personalmente non penso ancora che questa sia una buona ragione per scegliere il C rispetto al “C-style C ++”. La pazzia della struttura typedef è una ragione sufficiente per stare alla larga dal C, e ce ne sono molti altri.

Sfortunatamente C e C ++ sono entrambi linguaggi piuttosto terribili quando ci arriviamo. Questa è una delle ragioni per cui le persone hanno cercato di fare molto del loro codice in script negli ultimi anni.

Se stai cercando esempi di persone che lavorano in C, puoi ignorare id poiché ricordo di aver letto che hanno abbandonato C molto tempo fa. Cryptic Studios (Star Trek Online) fa tutto lo sviluppo del motore in C, però. Per quanto ne so, sì, è a causa della filosofia più che per un vantaggio tangibile.

Risposta

Sì e no. Sì, lho fatto qualche anno fa, ma avevo bisogno che il mio gioco girasse in 3D su un server remoto unix (non linux) a 64 bit con i giocatori su terminali stupidi. Non era banale. C può essere carino è vuoi integrare LUA ma alla fine ho ottenuto che lua funzioni in C ++ quindi direi di sì, è possibile ma non farlo.

Risposta

Una possibile buona risposta potrebbe essere” usa entrambi “?

Come ho sentito dire che i progetti di panda3d potrebbero essere ottimizzati, eliminando i colli di bottiglia usando un po di cython o ricodificando quelle parti.

La maggior parte delle volte, le parti che devono essere ottimizzate sono le parti con molte iterazioni e annidamenti o con molto calcolo numerico, quindi la mia ipotesi (selvaggia) è che un giusto compromesso sarebbe usare entrambi i linguaggi , usando C per parti che includono molta programmazione di basso livello, quindi non puoi fare un file y uso improprio del linguaggio C ++ per la parte che richiede velocità e C ++ per il resto del gioco.

Idealmente fai la parte veloce del motore tenendo presente il livello alto, e poi usi un linguaggio di scripting o C ++ che utilizzerà molto meno nest / loops.

Ovviamente non potresti mai creare un motore del genere che si adatti a tutti i giochi che gli sviluppatori dovrebbero fare, tranne se dedichi il tuo motore per uno speciale tipo di gioco …

Ma non dare per scontato il mio consiglio dato che non sono uno sviluppatore di giochi esperto né uno sviluppatore esperto … Penso che C ti costringa a scrivere codice veloce, mentre scrivi il codice C ++ buono e veloce per un progetto grande come un gioco è una cosa diversa …

Risposta

C ha funzionato per John Carmack , potresti ottenere molti vantaggi utilizzando C, ma finché non arrivi a trarne vantaggio potrebbe volerci un po di tempo.

Qui puoi trovare un elenco di motori di gioco alcuni o Se sono scritti in C, forse puoi ottenere alcune informazioni su come realizzare un motore di gioco C esaminando il loro codice sorgente.

Risposta

Il codice C è normalmente codice C ++ valido.

I problemi principali con C ++ sono il suo utilizzo errato ( Linus Torvalds lo odia per questo motivo , ha avuto anche altri problemi con la portabilità delle librerie e così via, sta lavorando a livello di sistemi operativi e deve essere in grado di eseguire le cose su ogni chip casuale disponibile).

Ad esempio non cè quasi alcun vantaggio nellusare un array cstyle [] su un c ++ std :: vector <> (o un contenitore simile).

I vettori sono typesafe e può essere controllato in base ai limiti (puoi accedere agli elementi usando get () o [], anche se non usi il metodo di controllo degli array puoi comunque interrogare la dimensione invece di spostarla con il puntatore).

Ma i vettori possono essere più lenti se, ad esempio, non dichiari la dimensione predefinita nel costruttore. Anche laggiunta di elementi a un vettore può causare rallentamenti se è necessario un ridimensionamento. C ++ 11 aggiunge anche molti vantaggi come linizializzazione uniforme (ora puoi dichiarare e inizializzare i vettori usando la stessa sintassi) e ci sono costruttori di spostamento che ti permettono di evitare la copia. Puoi persino creare i tuoi inizializzatori personalizzati (se per qualche motivo vuoi fare qualcosa di diverso dalluso di malloc).

Oppure, se hai bisogno di ridimensionare le cose, allora i vettori sono ancora più facili da fare con , non devi scherzare con malloc, copiare manualmente le cose e così via.

C ++ ti fornisce codice orientato agli oggetti. Quando compilato sarà altrettanto efficiente poiché è davvero unastrazione per gli esseri umani che lavorano con il codice. Anche se cose come i costruttori possono rallentare la creazione di oggetti. Ma avrai bisogno del costruttore per impostare i valori predefiniti o altrimenti puoi inizializzare gli oggetti senza usare il costruttore (tralasciando le () “s ).

Ma lorientamento agli oggetti rende molto più facile programmare i giochi. I giochi spesso hanno a che fare con oggetti.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *