Domanda

Riepilogo:

  

Posso programmare uno spessore di "   client " gioco in C senza reinventare   ruote , o dovrei solo mordere il   bullet e utilizzare qualche libreria o SDK?   Sono un programmatore C moderato e non lo sono   paura di lavorare con puntatori, dati   strutture, posizioni di memoria, ecc. se   mi darà il controllo di cui ho bisogno   fare un ottimo "client spesso" gioco.   Tuttavia, sto pensando di evitare   lingue di alto livello e amp; quadri per   per il potere e il controllo, non   facilità d'uso.

Sono interessante armeggiare con un gioco di combattimento / platform 2D come progetto secondario a volte. Sono principalmente un programmatore lato server Linux con esperienza in Python, Ruby e PHP. So che esistono alcuni framework eccellenti in alcune di queste lingue, come PyGame . Sono anche consapevole del successo che le persone hanno avuto con cose come Air e .NET ... ma ho alcune preoccupazioni:

  • Prestazioni : i linguaggi di scripting sono notoriamente lenti. Se sto realizzando un gioco in tempo reale, voglio che sia il più scattante possibile.
  • Binari enormi : l'uso di framework come .NET o linguaggi di scripting come Ruby spesso porta a grandi CLR o librerie che altrimenti non avresti bisogno. Il gioco che voglio fare sarà piccolo e semplice - non voglio che il suo CLR sia più grande del gioco stesso!
  • Roba extra : Onestamente, non mi piace l'idea di ereditare il bagaglio di qualche libreria di giochi di grandi dimensioni se posso avvolgere meglio la mia testa attorno al mio codice.

Sto ponendo questa domanda perché so di essere molto sensibile alla Sindrome di Non inventato qui. Voglio sempre programmarlo da solo e sono sicuro che perderà molto tempo. Tuttavia, questo funziona molto spesso per me, ad esempio invece di utilizzare Rails (una rete molto grande project framework con un toolkit ORM e GUI integrato), ho usato una serie di strumenti Ruby più piccoli come rack e sequel che si incastrano magnificamente.

Quindi, mi rivolgo a voi, così esperti. Sono ingenuo? Ecco come lo vedo:

  • Usa C
    • Contro
      • Probabilmente mi farà odiare la programmazione
      • Alto rischio di reinventare le ruote
      • Alto rischio che ci impieghi così tanto tempo che perdo interesse
    • Pro
      • Provato & amp; true - la maggior parte dei giochi di A-list sono realizzati in C (è ancora vero oggi?)
      • Alto livello di controllo su gestione della memoria, velocità, gestione delle risorse, ecc., che mi fido di imparare a gestire
      • Nessuna cruft
  • Usa framework o SDK
    • Contro
      • Rischio di prodotti sovradimensionati
      • Dipendente dagli autori originali delle biblioteche per tutti gli aspetti dello sviluppo del gioco - cosa succede se non c'è una funzione che desidero? Dovrò programmarlo da solo, il che non è male, ma in parte sconfigge lo scopo di utilizzare un framework di alto livello
      • Alto rischio di problemi di prestazioni
    • Pro
      • Tempo di sviluppo MOLTO più veloce
      • Potrebbe essere più facile da mantenere
      • Non perdete tempo a reinventare i paradigmi comuni

Cos'altro posso aggiungere a questo elenco? È un semplice appello di giudizio o qualcuno può sigillare l'affare per me? Suggerimenti per i libri benvenuti.

È stato utile?

Soluzione

Il mio pensiero attuale è:

  • Se vuoi imparare a programmare, inizia a creare il motore di gioco dagli elementi di base verso l'alto (anche implementando strutture di dati di base - elenchi, mappe, ecc.). L'ho fatto una volta, e mentre è stata un'esperienza di apprendimento, ho fatto molti errori e non lo farei una seconda volta. Tuttavia, per imparare a programmare, per creare qualcosa di interessante e vedere i risultati, lo valuto molto.

  • Se vuoi creare un gioco adeguato, usa le librerie che desideri e progetta tu stesso tutta l'infrastruttura di gioco. Questo è quello che sto facendo ora e sto usando tutte le cose carine come STL, ATL / WTL, Boost, SQLite, DirectX, ecc. Finora ho imparato molto sull'aspetto logico di medio / gioco di il codice e il design.

  • Se vuoi solo fare un gioco con artisti e altre persone che collaborano per creare un prodotto finito, usa uno dei motori esistenti (OGRE, Irrlicht, Nebula, Torque, ecc.) e aggiungi semplicemente la tua logica di gioco e arte.

Un ultimo po 'di saggezza che ho imparato è che non preoccuparti della sindrome di Non inventato qui. Come ho capito che altre librerie (come STL, Boost, DirectX, ecc.) Hanno un ordine di grandezza (o tre) più ore-uomo di tempo di sviluppo in esse, molto più di quanto potrei mai spendere in quella porzione del gioco / motore. Pertanto, l'unica ragione per implementare queste cose da soli è se vuoi conoscerle.

Altri suggerimenti

Credo che tu stia lavorando con un errore.

Esistono diversi framework specifici per la programmazione di giochi --- scritti da persone con molta esperienza con la complicazione del design del gioco, quasi sicuramente più di quello che fai.

In altre parole, hai un "alto rischio di problemi di prestazioni" se NON usi un framework.

Consiglierei di provare pyglet .

  • Ha buone prestazioni, poiché utilizza l'opengl
  • È una libreria all-in-one compatta
  • Non ha dipendenze extra oltre a Python

Fai alcuni test, vedi se riesci a renderlo abbastanza veloce per te. Solo se dimostrerai a te stesso che non passa a un livello inferiore. Tuttavia, sono abbastanza sicuro che python + pyglet sia in grado di gestirlo ... nel peggiore dei casi dovrai scrivere alcune estensioni C.

Oggi, credo che tu sia a un punto in cui puoi tranquillamente ignorare il problema delle prestazioni a meno che tu non stia specificamente cercando di fare qualcosa che superi i limiti. Se, ad esempio, il tuo gioco non è più complicato di Quake II, allora dovresti scegliere gli strumenti e le librerie che ti consentono di fare il massimo per il tuo tempo.

Perché ho scelto Quake II? Poiché in esecuzione in una versione compilata per .NET , funziona con un renderer software a un livello superiore a frame rate accettabile su una macchina corrente. (Se ti piace, confronta MAME che emula più processori e hardware grafico a tariffe accettabili)

Devi chiederti se ci sei dentro per costruire un motore o per costruire un gioco. Se il tuo scopo è creare un gioco, dovresti assolutamente guardare a un motore di gioco affermato. Per lo sviluppo di giochi 2D, guarda Torque Game Builder . È un motore di gioco 2D / SDK molto potente che ti metterà in produzione dal primo giorno. Hanno un sacco di strumenti che si integrano con esso, pacchetti di contenuti e ottieni il codice sorgente completo se vuoi apportare modifiche e / o imparare come funziona. È anche compatibile con Mac OSX e ha versioni Linux nella community.

Se stai cercando qualcosa sul lato console, anche quello ha quello.

Sono sorpreso che nessuno abbia menzionato XNA . È un framework costruito attorno a DirectX per l'esecuzione della programmazione DirectX gestita, eliminando al contempo la fluff e la verbosità della programmazione DirectX di livello inferiore.

Dal punto di vista delle prestazioni, per la maggior parte delle attività di gioco 2D e 3D, in particolare la costruzione di qualcosa come un gioco di combattimento, questa piattaforma funziona molto bene. Non è così veloce come se stessi facendo una programmazione DirectX bare metal, ma ti avvicina molto, e in un ambiente gestito, non meno.

Un altro interessante vantaggio di XNA è che la maggior parte del codice può essere eseguito su Xbox 360 e può anche essere sottoposto a debug tramite la connessione di rete se il gioco viene eseguito su Xbox. Ora i giochi XNA possono essere approvati dal team Xbox Live per la distribuzione e la vendita anche su Xbox Live Arcade. Quindi, se stai cercando di portare il progetto a uno stato commerciale, potresti avere a disposizione mezzi di distribuzione a tua disposizione.

Come tutti gli strumenti di sviluppo degli MS, la documentazione e il supporto sono di prim'ordine, e c'è una grande comunità di sviluppatori con molti tutorial, progetti esistenti, ecc.

Vuoi essere in grado di giocare su una console? Vuoi farlo come esperienza di apprendimento? Vuoi che il prodotto finale sia multipiattaforma? In quali librerie hai esaminato finora?

Per un gioco in 2D non credo che le prestazioni saranno un problema, ti consiglio di scegliere qualcosa che ti porti i risultati sullo schermo nel minor tempo possibile. Se hai molta esperienza con Python, allora pyGame è una buona scelta.

Se hai intenzione di fare alcuni giochi 3d in futuro, ti consiglio di dare un'occhiata a Ogre ( http: // www.ogre3d.org ). È un motore grafico 3d multipiattaforma che estrae le API grafiche. Tuttavia, per un progetto 2d è probabilmente eccessivo.

Il linguaggio di implementazione più comune per i giochi A-list oggi è C ++ e molti giochi incorporano un linguaggio di scripting (come Python o Lua) per lo scripting di eventi di gioco.

Gli strumenti che useresti per scrivere un gioco hanno molto a che fare con le tue ragioni per scriverlo e con i tuoi requisiti. Questo non è diverso da qualsiasi altro progetto di programmazione, davvero. Se si tratta di un progetto secondario e lo stai facendo da solo, solo tu puoi valutare quanto tempo devi dedicare a questo e quali sono i tuoi requisiti di prestazione.

In generale, i PC di oggi sono abbastanza veloci da eseguire platform 2D scritti in linguaggi di scripting. L'uso di un linguaggio di scripting ti permetterà di prototipare le cose più velocemente e avrai più tempo per modificare il gameplay. Ancora una volta, questo non è diverso rispetto a qualsiasi altro progetto.

Se vai con C ++ e i tuoi motivi non devono essere più elaborati di " perché voglio farlo, " Suggerirei di consultare SDL per il rendering e il supporto audio. Renderà le cose un po 'più facili.

Se vuoi imparare le tecnologie sottostanti (DirectX o vuoi scrivere blitter ottimizzati per qualche motivo perverso) allora usa C ++.

Detto questo, ti metterei in guardia dall'ottimizzazione prematura. Per un gioco 2D, probabilmente starai meglio con Python e PyGame prima. Sarei sorpreso se quegli strumenti si dimostrassero inadeguati sui PC moderni.

Quanto a ciò che la gente ha detto su C / C ++ / Python, sono uno sviluppatore di giochi e la mia azienda incoraggia C. Non b / c Il C ++ è un male, ma perché il C ++ scritto male è un veleno per lo sviluppo del gioco a causa della sua difficoltà leggere / eseguire il debug rispetto a C. (C ++ offre vantaggi se usato correttamente, ma lascia che un ragazzo minore commetta degli errori e il tempo che sprechi è enorme)

Per quanto riguarda la domanda effettiva: Se il tuo scopo è semplicemente far funzionare qualcosa, usa una libreria.

Altrimenti, codificalo tu stesso per un motivo molto importante: Pratica
Pratica nel manipolare le strutture di dati. Ci saranno volte in cui dovrai gestire i tuoi dati. Esercitati nel debug del codice di utilità.

Spesso le librerie fanno esattamente quello che vuoi e sono grandiose, ma a volte il caso d'uso specifico IL TUO è gestito in modo molto grave dalla lib e otterrai grandi benefici dalla scrittura che possiedi. Questo è particolarmente su console rispetto ai PC

(modifica :) Per quanto riguarda lo script e la garbage collection: ti ti ucciderà su una console, in un recente gioco ho dovuto riscrivere grandi parti della garbage collection su Unreal solo per soddisfare le nostre esigenze in la parte editor . Ancora di più doveva essere fatto nel gioco reale (non solo da me) (per essere onesti anche se stavamo spingendo oltre le specifiche originali di Unreal)

Lo scripting spesso è buono, ma non è un " Vinco " pulsante. In generale i guadagni scompaiono se stai spingendo contro i limiti della tua piattaforma. Vorrei utilizzare il "percento delle piattaforme CPU che devo risparmiare" come mia funzione di valutazione nel decidere quanto è appropriato lo script

Una considerazione a favore di C / C ++ / obj-C è che puoi mescolare e abbinare varie librerie per diverse aree di interesse. In altre parole, non sei bloccato con l'implementazione di una funzione in un framework.

Uso questo approccio in i miei giochi ; utilizzando chipmunk per la fisica 2D, Lua come linguaggio di scripting incorporato e un'implementazione di openGL ES da Apple. Scrivo la colla per legare tutti insieme in un linguaggio C. Il prodotto finale è la capacità di definire oggetti di gioco, crearne istanze e gestire eventi mentre interagiscono tra loro in funzioni C esposte a Lua. Questo approccio è utilizzato in molti giochi ad alte prestazioni con grande successo.

Se non conosci già il C ++, ti consiglio vivamente di andare avanti con un linguaggio di scripting. Fare un gioco dall'inizio alla fine richiede molta motivazione e costringersi ad imparare una nuova lingua allo stesso tempo è un buon modo per far andare le cose abbastanza lentamente da perdere interesse (anche se È un buon modo per imparare una nuova lingua ...).

La maggior parte dei linguaggi di scripting verrà comunque compilata in codice byte, quindi il loro più grande successo in termini di prestazioni sarà la garbage collection. Non ho abbastanza esperienza per dare una descrizione precisa di quanto sarebbe grande una raccolta di rifiuti di successo, ma sarei propenso a pensare che non dovrebbe essere così male in un piccolo gioco.

Inoltre, se usi una libreria di linguaggi di scripting esistente per creare il tuo gioco, la maggior parte delle aree critiche per le prestazioni (come la grafica) può comunque essere scritta in C ++ (si spera dalle librerie di gioco). Quindi l'80% della CPU potrebbe effettivamente essere speso in codice C ++ comunque, nonostante il fatto che la maggior parte del progetto sia scritta, diciamo Python.

Direi, chiediti cosa vuoi di più: scrivere un gioco dall'inizio alla fine e conoscere lo sviluppo del gioco o imparare una nuova lingua (C ++). Se vuoi scrivere un gioco, fallo in un linguaggio di scripting. Se vuoi imparare una nuova lingua, fallo in C ++.

Sì, a meno che tu non voglia semplicemente imparare tutti i dettagli delle cose che vanno nel creare un gioco, sicuramente vuoi andare con un motore di gioco e concentrarti solo sulla costruzione della logica di gioco piuttosto che sui dettagli di grafica, audio, gestione delle risorse, ecc.

Personalmente mi piace raccomandare Torque Game Builder (aka Torque 2D) da GarageGames . Ma probabilmente troverai alcuni motori di gioco gratuiti là fuori che soddisfano anche le tue esigenze.

Sono abbastanza sicuro che la maggior parte dei giochi moderni sia fatta in C ++, non in C. (Ogni società di gioco che abbia mai intervistato con domande in C ++).
Perché non usare C ++ e le librerie esistenti per fisica + collisioni, suono, motore grafico, ecc. Continui a scrivere il gioco, ma le cose banali sono curate.

Esistono molte soluzioni diverse al problema dell'astrattismo e ciascuna di esse lo affronta in modi diversi.

Il mio progetto attuale utilizza C #, DirectX 9, HLSL e SlimDX. Ognuno di questi offre un livello di astrazione accuratamente calibrato. HLSL mi permette di leggere effettivamente il codice shader che sto scrivendo e SlimDX / C # mi permette di ignorare puntatori, dipendenze circolari e gestire il codice non gestito.

Detto questo, nessuna di queste tecnologie ha alcun impatto sulla facilità di sviluppo della mia intelligenza artificiale, illuminazione o fisica! Devo ancora rompere i miei libri di testo in un modo che non avrei con un quadro di livello superiore.

Anche usando un framework come XNA, se la maggior parte dei concetti di sviluppo dei videogiochi ti sono estranei, c'è ancora molto da imparare e da imparare. XNA ti consentirà di evitare con cura il blocco del gimbal, ma guai a coloro che non capiscono i concetti di base dell'ombreggiatura. D'altra parte, qualcosa come DarkBASIC non risolverà il problema del blocco del gimbal, ma l'ombreggiatura viene gestita principalmente per te.

È un campo sufficientemente grande che il tuo primo motore non sarà mai quello che effettivamente usi. Se lo scrivi da solo, non lo scriverai abbastanza bene. Se usi librerie di terze parti, ci sono sicuramente aspetti che ti infastidiranno e vorrai sostituirli.

Come idea, potrebbe valere la pena di prendere varie librerie / framework (sicuramente rendere XNA uno dei tuoi punti di arresto, anche se decidi di non usarlo, è un ottimo punto di riferimento) e provare a costruire vari prototipi. Forse un paesaggio (con uno specchio d'acqua) o una demo di fisica spaziale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top