2009-05-07 26 views
9

Fino a che punto sono moderne C++ caratteristiche come:C++ moderno gioco Esempi di programmazione

  1. polimorfismo,
  2. STL,
  3. eccezione sicurezza/gestione,
  4. modelli con design di classe basata su policy,
  5. smart pointers
  6. nuovo/cancella, posizionamento nuovo/cancella

utilizzato negli studi di gioco? Sarei interessato a conoscere i nomi delle librerie e le caratteristiche del C++ che usano. Ad esempio, Orge3D utilizza tutte le moderne funzionalità C++, incluse eccezioni e puntatori intelligenti. In altre parole, se cercassi un esempio per una libreria di giochi usando il C++ moderno, andrei su Orge3D. Ma non so se queste caratteristiche impediscano agli studi di gioco di utilizzare Orge3D.

Inoltre non so se ci sono altri esempi. Ad esempio, ho usato Box2D un po 'di tempo prima, ma usa solo il posizionamento nuovo e la parola chiave class come le caratteristiche del C++. Anche l'incapsulamento è rotto in queste classi poiché tutti i membri sono pubblici.

Idealmente, se funzioni C++ sarebbe la migliore corrispondenza per tutte le situazioni, questi sarebbero stati utilizzati più di frequente. Ma non sembra. Quali sono le impedenze? L'ovvio è dover leggere pile di libri, ma questa è solo una mezza ragione. Questa domanda è un follow-up su "C++ for Game Programming - Love or Distrust?" (Dalle risposte lì ho avuto l'impressione che molte funzioni C++ non sono ancora utilizzati nei giochi, che non è necessariamente il modo in cui dovrebbe essere).

+0

Una domanda correlata è un esempio di libreria che utilizza il C++ moderno: stackoverflow.com/questions/534311/.... Oltre ai soliti esempi di Boost e Loki, la discussione menziona le librerie di Google Chrome, OpenOffice e Adobe. Ulteriori informazioni su http://www.boost.org/users/uses_open.html per gli usi di boost. –

+0

Googling Ho trovato http://www.deitel.com/ResourceCenters/Programming/CPlusPlusGameProgramming/tabid/1225/Default.aspx Contiene un paio di link che potrebbero interessarti. P.S. Potresti voler fare questa domanda wiki della comunità. – lothar

+0

@lothar Non so se c'è un modo per renderlo un wiki della comunità ora. –

risposta

25

Ho lavorato in 2 società di giochi, ho visto un certo numero di codebase e ho osservato una serie di dibattiti su argomenti come questi tra gli sviluppatori di giochi, quindi potrei essere in grado di offrire alcune osservazioni. La risposta breve per ogni punto è che varia molto da studio a studio o anche da squadra a squadra all'interno dello stesso studio. risposte lunghe elencate di seguito:

  • polimorfismo,

Utilizzato da alcuni studi, ma non altri. Molte squadre preferiscono ancora evitarlo. Le chiamate alle funzioni virtuali hanno un costo e il costo è evidente a volte anche sulle console moderne. Di quelli che usano il polimorfismo, la mia ipotesi cinica è che solo una piccola percentuale lo usa bene.

  • STL,

diviso a metà, per molte delle stesse ragioni di polimorfismo. STL è facile da usare in modo errato, quindi molti studi scelgono di evitarlo per questi motivi. Di quelli che lo usano pesantemente, molte persone lo accoppiano con gli allocatori personalizzati. EA ha creato EASTL, che risolve molti dei problemi STL relativi allo sviluppo del gioco.

  • eccezione sicurezza/gestione,

Pochissimi studi di utilizzare la gestione delle eccezioni. Uno dei primi consigli per le console moderne è disattivare sia RTTI che le eccezioni. I giochi per PC probabilmente usano le eccezioni a un effetto molto più grande, ma tra le console le eccezioni sono molto spesso evitate. Aumentano la dimensione del codice, che può essere un premio, e letteralmente non sono supportati su alcune piattaforme rilevanti.

  • modelli con design di classe basata su policy, design

politica basata ... Non sono venuto attraverso qualsiasi di esso. I modelli sono usati molto spesso per cose come l'introspezione/riflessione e il riutilizzo del codice. Il design basato sulla politica, quando ho letto il libro di Alexandrescu, mi sembrava una promessa sbagliata. Dubito che sia usato molto pesantemente nell'industria del gioco, ma varierà molto da studio a studio.

  • puntatori intelligenti

puntatori intelligenti sono abbracciati da molti degli studi che utilizzano anche il polimorfismo e STL. La gestione della memoria nei giochi per console è estremamente importante, quindi molte persone non amano il conteggio dei riferimenti ai puntatori intelligenti perché non sono espliciti riguardo a quando liberano ... ma questi non sono certamente l'unico tipo di puntatore intelligente. L'idea del puntatore intelligente in generale sta ancora guadagnando terreno. Penso che sarà molto più comune in 2-3 anni.

  • new/delete, nuova collocazione/delete

Questi sono usati di frequente. Spesso sono sovrascritte per utilizzare gli allocatori personalizzati sottostanti, in modo che la memoria possa essere rintracciata e le perdite possano essere trovate con facilità.

Penso di essere d'accordo con la vostra conclusione. Il C++ non è usato negli studi di gioco per quanto possibile.Ci sono buone e cattive ragioni per questo. Le buone sono a causa delle implicazioni sulle prestazioni o dei problemi di memoria, le cattive sono perché le persone sono bloccate in un solco. In molti modi ha senso fare le cose nel modo in cui sono sempre state fatte, e se ciò significa C con C++ limitato allora significa C con C++ limitato. Ma ci sono un certo numero di pregiudizi anti-C++ in giro ... alcuni giustificati e altri no.

10
  1. abbastanza estesamente, anche se le persone sono consapevoli del sovraccarico di funzione virtuale chiamate
  2. Dipende. Alcuni sviluppatori lo abbandonano completamente, altri fanno uso limitato di contenitori come i vettori che avranno una buona coerenza di cache e prestazioni di runtime e non verranno allocati costantemente. Penso che un'osservazione generale sia che più lo studio è orientato alla console e meno il STL che usano. Gli sviluppatori di PC possono farla franca perché possono ricorrere al sistema di memoria virtuale e c'è un sacco di CPU. I ragazzi della console si preoccupano di ogni allocazione e se si sta facendo un titolo multipiattaforma si entra nel meraviglioso mondo delle implementazioni STL di diverse piattaforme che si comportano in modo diverso e hanno diversi bug, anche se questa situazione è sicuramente migliorata negli ultimi anni. Gli sviluppatori di giochi amano anche gestire i propri heap e allocazioni e questo può essere difficile da gestire con STL.
  3. Si aspetta che sia disabilitato nelle impostazioni del compilatore
  4. Haha, uno buono.
  5. Non ne sono sicuro. Non ho davvero visto l'utilizzo intelligente del puntatore nel codice di gioco, anche se a parte l'avversione generale alla memoria dinamica, non penso che ci sia qualcosa di particolarmente discutibile nei confronti di puntatori intelligenti dal punto di vista dello sviluppo del gioco.
  6. Questo dipende ancora. I ragazzi PC possono allocare e deallocarsi come se non gliene importasse. I ragazzi della console si preoccupano di ogni allocazione. Ciò non significa niente di nuovo e di cancellazione, ma può significare che le allocazioni dinamiche vengono eseguite una sola volta quando il gioco o il livello corrente è impostato e poi lasciato fino a quando il gioco o il livello attuale non viene abbattuto. Si consiglia di evitare l'allocazione e la deallocazione di frame, non solo per mantenere l'utilizzo della memoria totale, ma per evitare la frammentazione. Vedrai un sacco di matrici di dimensioni fisse e strutture allocate staticamente in un motore di gioco per console.
+0

# 2: l'STL consente di controllare completamente la gestione della memoria di qualsiasi contenitore # 4: Perché? –

+0

Il link Dan pubblicato su EASTL ha una buona copertura di questo argomento. –

+0

Non capisco la tua risposta al # 4. – Klaim

7
  1. sacco
  2. modo di tanto. Ma stiamo cercando di limitarci a std :: vector in fase di esecuzione.
  3. Nessuno come mai.
  4. Cosa?
  5. Il nostro codice è stato infettato da questa malattia sì. Inizieremo comunque a frustare le persone per diffondere il flagello.
  6. Sì. Molte.
+2

Non so perché questa risposta sia stata rifiutata. Sembra una risposta onesta (potrebbe non essere una "corretta", se vuoi), e voterò. –

+0

Stavo per digitarlo anch'io ... È una risposta reale che descrive lo stato corrente in cui lavoro. Grazie per il voto :) – JJacobsson

-1

Con tutto il dovuto rispetto, 5 su 6 punti che hai menzionato sono gergo C++ standard. Non è "la programmazione di giochi", è un uso ingenuo di parole d'ordine. La mia raccomandazione sarebbe questa; impara la matematica ... trigly in particolare. Poi prendi alcuni fogli di dati e impara a conoscere le moderne piattaforme di hardware grafico ... non le delicate parole di bullismo di C#. Impara a programmare gli assemblatori.

Alla fine della giornata, per essere un programmatore di giochi devi essere in grado di fare matematica. Ecco cos'è

+1

Questa non è una risposta utile senza specificità e con un eccessivo rimprovero del poster. – bcr

Problemi correlati