STL per i giochi, sì o no? [chiuso]


144

Ogni linguaggio di programmazione ha la sua libreria standard di contenitori, algoritmi e altre cose utili. Con linguaggi come C #, Java e Python, è praticamente inconcepibile usare il linguaggio senza la sua lib standard.

Eppure, su molti giochi C ++ su cui ho lavorato, o non abbiamo usato affatto lo STL, ne abbiamo usato una piccola parte o abbiamo usato la nostra implementazione. È difficile dire se quella sia stata una buona decisione per i nostri giochi, o semplicemente fatta per ignoranza della STL.

Quindi ... l'STL è adatto o no?



1
Sì, è quello che intendevo per "usato la nostra stessa implementazione". :)
munifico

3
Se hai la possibilità di trovare e acquistare gemme di programmazione Best of Game, fallo. C'è un titolo dell'articolo "Uso dell'STL nella programmazione dei giochi" di James Boer, ArenaNet, in cui si cela davvero bene usando l'STL.
chiguire,

In realtà usare Java senza la sua lib standard è abbastanza concepibile, si chiama J2ME: p
Bart van Heukelom,

1
Ottima domanda!
Alan,

Risposte:


191

Quando lavoravo allo sviluppo di giochi professionali, STL era troppo immaturo e gonfio. Ma è stato> 10 anni fa.

Ora lavoro nella simulazione militare, che ha requisiti di prestazione ancora più severi (come il framerate non può mai andare al di sotto di alcuni FPS). Nella simulazione militare STL è utilizzato ovunque.

Alcune persone che ti dicono di non usare STL usano l'argomento che non è sempre la soluzione perfetta o addirittura migliore al problema. Ma questa non è una risposta alla domanda. La domanda dovrebbe essere: c'è qualcosa di intrinsecamente sbagliato nell'uso dell'STL nei giochi? Direi di no, la maggior parte delle volte STL è un'implementazione migliore di quella che un utente si inventerebbe da solo.

Assicurati di sapere come utilizzare l'STL e utilizzalo nel tuo gioco. Leggi alcuni libri e guarda il codice di implementazione nell'STL che stai utilizzando.


49
Questo è un consiglio piuttosto solido. Il meme "STL è lento" non è stato vero per almeno cinque anni e probabilmente molto più a lungo. Continuerà a sopravvivere, proprio come "Java è lento" e ".NET è lento" senza senso, fino a quando non diventa evidente a tutti che non è più il caso. STL ti aiuta a scrivere programmi migliori; Andrei fino al punto di dire che non usarlo, nella maggior parte dei casi (a parte lo 0,1% da qualche parte), è irresponsabile. (Le affermazioni secondo cui non si adatta a un determinato dominio problematico sono spesso più un'accusa del modo in cui il problema è stato affrontato, non lo stesso STL. Correggi il tuo codice, gente.)
Ed Ropple,

5
@Ed Ropple: penso che il problema non sia che STL non si adatta a un determinato problema, il problema è che si adatta a troppi problemi che rendono il codice in esso troppo complesso. È spaventoso il modo in cui le persone fanno un uso eccessivo di STL e penso che sia una delle cause per cui così tanti (incluso me stesso) si astengono dall'utilizzarlo. Come un esempio che ho visto non molto tempo fa, dove la domanda era come ottenere il più grande dei 3 numeri, una delle risposte stava spingendoli in uno std :: vector e poi in std: ordinarlo. Questo è sicuramente forzare una soluzione che è inutile su un problema molto semplice.
Simon,

22
@Simon: con tutto il rispetto, l'ultimo esempio è un segno di estrema mancanza di chiarezza, e non ha nulla a che fare con STL ... quella persona farebbe lo stesso in qualsiasi altra lingua con elenchi che possono essere ordinati. È il suo pensiero che è rotto.
ggambett,

@EdRopple tenta di implementare un parser STL per i file di immagine PPM (meno di 100 righe di codice in totale se si rivolge solo a P6 o P3). La metà del codice risultante è solo per saltare le righe di commento perché STL non fornisce qualcosa di simileif(stream.nextCharacter() == '#') stream.skipLine();
GameDeveloper

@DarioOO Non conosco quel formato di file, ma è a questo che servono gli adattatori di flusso e i filtri. Ho scritto quel commento cinque anni fa, mente (e ogni tanto continua a tornare!), Ma in questi giorni scrivo di tutto ciò che non è super, super-critico in uno stile funzionale, basato su trasformazioni e problemi come quello che tu stai descrivendo cadere dal problema. Non mi importa molto del conteggio delle righe (e dell'IMO né di voi), mi preoccupo della correttezza dell'implementazione, quindi della chiarezza, quindi delle prestazioni e quindi di cose come la lunghezza del codice.
Ed Ropple,

63

Direi che, al di sopra della mia testa, è un'idea migliore usare l'STL a meno che tu non sappia esattamente perché non vuoi usarlo.

Ecco la cosa sull'STL: è sviluppato da persone più intelligenti di te. Non è pensato per essere offensivo o altro, è solo che lo STL è sviluppato da persone il cui lavoro sta effettivamente costruendo lo STL. Sarà praticamente veloce quanto la piattaforma può consentire e sarà generalmente molto più robusto di una soluzione home-roll (e questo dovrebbe essere tanto preoccupante se non più di preoccuparsi della velocità pura - perché il tuo gioco ha bisogno robustezza un po 'più di quanto sia necessaria la velocità; quest'ultima non ha senso senza la prima).

Le lamentele secondo cui la STL impone una "visione ristretta del mondo" mi sembrano un po 'sciocche. Sono contenitori. Hanno un insieme limitato di operazioni perché i contenitori hanno un insieme limitato di operazioni. Cosa stai facendo che non ti fa arrabbiare con questo?


4
Non penso che qualcuno dovrebbe giustificare il motivo per cui non dovrebbero usare STL. Inoltre, non sono d'accordo con l'intero argomento "usalo perché sono più intelligenti di te". STL è stato progettato attorno a una vista specifica di un dominio problematico, non solo contenitori, ovvero algoritmi, allocatori, iteratori, tratti ecc. È abbastanza giusto ma non è l'unico modo di guardare quel dominio problematico
zebrabox

2
Preferiresti invece il codice di casa che il codice generalmente testato e fortemente robusto? Il dominio problematico non è poi così diverso da progetto a progetto (a parte forse progetti integrati - anche le console hanno implementazioni STL decenti in questi giorni!). Indipendentemente dal gioco, il tuo problema non è poi così diverso e se stai realizzando qualcosa che intendi spedire, hai la responsabilità implicita di scrivere un codice robusto. La reimplementazione della ruota porterà a una migliore robustezza e flessibilità? Mi sposto verso il "no". Il fatto che non sia "l'unico modo" non implica che non sia generalmente superiore.
Ed Ropple,

20
Direi che gamedev riguarda la creazione di giochi , ma va bene. Se le tue assunzioni sono così povere che ti stai esercitando su quel tipo di allocazione delle risorse, allora sì, devi fare un passo indietro e rivalutarle. Ma puoi realizzare applicazioni incredibilmente veloci che usano lo STL altrettanto bene - e, certamente, qualsiasi altra implementazione - quando sai davvero cosa stai facendo . Imparando cosa stai facendo> ceneri cargo un rifiuto della STL. Nessuno ha mai detto che l'STL è sempre la risposta migliore. Quello che sto dicendo è che se non riesci a capire perché non è il corso migliore , dovresti usare STL.
Ed Ropple,

11
Non penso che sia provocatorio - è formulato in modo tale da farlo rimanere nella memoria di qualcuno, ma è una posizione estremamente conservatrice e diretta. In breve: le persone che sviluppano la STL sono più informate e meglio equipaggiate di qualcuno che scopre di dover porre questa domanda. Se devi chiedere a qualcun altro se lo STL è appropriato o meno, quasi sicuramente ti mancano le conoscenze specifiche del dominio per preparare adeguatamente una soluzione fatta in casa.
Ed Ropple,

4
"Sarà praticamente veloce quanto la piattaforma può consentire". Questa è una falsità definitiva, dal momento che molti produttori di compilatori non possono preoccuparsi di riscrivere l'STL in modo da ottenere davvero il massimo delle prestazioni dalla particolare architettura. STL non ha alcuna garanzia in merito alle caratteristiche prestazionali se non per la grande O. O tuttavia potrebbe essere efficiente o inefficiente come il produttore del compilatore vuole realizzarlo.
Kaj,

35

Ho visto pochissimi motivi per non utilizzare l'STL per i giochi.

Per i problemi di allocazione della memoria, molte persone non lo sanno, ma è possibile scrivere allocatori personalizzati per le classi del contenitore STL. Gli allocatori sono fondamentalmente classi di criteri che passi nei tuoi modelli per determinare come vengono eseguite le allocazioni. Usandoli di solito puoi aggirare qualunque problema di memoria sia problematico sulla tua piattaforma preferita.

Naturalmente, se stai usando l'STL e stai facendo cose stupide come mappe di stringhe a tipi grandi, senza puntatore, allora hai grossi problemi a portata di mano.


l'utilizzo di tipi non puntatori di grandi dimensioni nella mappa è un buon caso d'uso poiché le mappe stdlib hanno il requisito di non invalidare iteratori che impongono l'implementazione nell'uso di puntatori e di elementi mappati allocati individualmente. La migliore soluzione per i giochi è usare google::sparse_mapo scrivere la propria.
v.oddou,

perché non una mappa densa?
GameDeveloper

23

L'STL predefinito presenta un numero discreto di problemi che ne rendono difficile l'utilizzo con i giochi, soprattutto quando si tratta di allineamento della memoria.

Una variante personalizzata come EA STL è appositamente progettata per i giochi e può offrirti prestazioni di memoria e usabilità della console molto migliori. È diventato open source nel 2016, con una clausola BSD-3, con un repository su GitHub .


19
I problemi con l'uso della memoria di STL e i giochi possono di solito essere risolti con classi di allocatore personalizzate. In effetti, nel mio lavoro precedente, la nostra classe vettoriale "personalizzata" era solo un involucro sottile attorno a std::vectorcui si sovrapponeva l'allocatore predefinito.
Blair Holloway,

1
@Blair Holloway: "Gli allocatori personalizzati sono basati su classi, non su istanze. Gli allocatori sono tenuti a costruire e distruggere oggetti, nonché a allocarli. Ciò impone la miscelazione di due concetti separati: allocazione e costruzione. Questi sono solo alcuni dei i problemi con gli allocatori stl, sfortunatamente ". EA STL fornisce molte altre valide ragioni per cui gli allocatori STD sono sbagliati. Non è solo "se o no possono essere ignorati".
Simon,

@Simon - Non sosterrò che il sistema di allocazione dell'STL è perfetto, perché non lo è. Ci è voluto molto tempo per trovare una soluzione che funzionasse. Quello che sto dicendo è che in alcuni casi è possibile ottenere una soluzione praticabile e adatta al gioco usando STL e un po 'di lavoro con allocatori personalizzati.
Blair Holloway,

@Simon - Per elaborare: mentre l'STL può essere ingombrante, è un pezzo di codice molto ben testato e privo di bug; se puoi usarlo, risparmierai ore lavorative dovendo eseguire il debug di una soluzione personalizzata. Il mio lavoro attuale evita l'STL a favore degli allocatori prodotti in casa, e ho dovuto dedicare del tempo al debug e al refactoring di quel codice, perché non ha lo stesso livello di maturità dell'STL.
Blair Holloway,

1
@Simon: sono un po 'in ritardo alla festa qui, ma sono curioso di sapere se potresti dare un esempio specifico di ciò che intendi. Qual è un buon esempio di risoluzione di un problema specifico in modo che lo STL sia troppo generale per risolverlo in modo efficiente?
BRaffle,

21

Ecco cosa ha detto Mike Acton (direttore del motore di Insomniac Games of Spyro the Dragon, Ratchet & Clank e Resistance) quando gli è stato chiesto qui . Nota che gli è stato chiesto sia di STL che di Boost in generale in relazione all'utilizzo nello sviluppatore di giochi.

STL / Boost, appartiene a gamedev? Se solo parti di esso, quali?

Stai chiedendo due cose diverse qui, giusto? STL e Boost, separatamente. Ma davvero, la mia risposta è la stessa: non c'è niente di sbagliato in nessuno dei due, ma scoraggio il loro uso. L'uso di entrambi incoraggia le persone a adattare una soluzione a un problema piuttosto che a trovare una soluzione a un problema. La soluzione dovrebbe essere sempre adeguata ai dati a portata di mano e ai vincoli dell'hardware, ecc. Sia STL che Boost hanno una visione estremamente ristretta del "mondo" e il loro uso appropriato è limitato. Davvero, li scoraggio perché guidano subito i programmatori nella direzione sbagliata, spesso dico che se senti di aver bisogno di uno dei due, probabilmente non capisci davvero il problema che

Ho anche notato che la maggior parte degli sviluppatori di giochi pro punta più al C che al C ++.


18
Non sono d'accordo sulla ricerca di più verso C. La stragrande maggioranza degli sviluppatori di giochi e degli scrittori di SDK usano il C ++. In effetti l'ultimo grande utente C era id e persino Carmack è passato a C ++ ora ...
Goz,

82
Il commento del signor Acton sembra impreciso. In generale, l'STL si adatta bene a questi problemi. Se stai cercando di fare qualcosa in modo tale che l'approccio STL sembri "sbagliato", è probabilmente una buona idea rivalutare il tuo approccio e vedere se lo stai effettivamente facendo in modo intelligente. Nella mia esperienza, il più delle volte, probabilmente non lo sei. (È molto più intelligente, IMO, risolvere un problema
capendolo

50
La mia esperienza con STL è stata quasi opposta. È efficiente e fa risparmiare tempo. Se senti la necessità di creare la tua libreria di modelli o librerie contenitore, allora va bene. Ma non far finta che l'STL (o il boost, del resto) sia cattivo. Ho usato ampiamente STL su giochi commerciali per iPhone, Nintendo DS, Wii, PC, Mac e Xbox. Ogni volta che sono stato costretto a utilizzare la libreria "migliore" di qualcun altro, l'ho trovato carente e difettoso.
BRaffle

5
Funziona bene sul DS come su qualsiasi altra piattaforma su cui l'ho usato. Ho usato STL in tutta l'interfaccia utente e il codice AI. Il gioco era ds.ign.com/articles/832/832147p1.html .
Lavoravo

7
Mike si occupa di dati. Guardare i dati suggerisce il metodo migliore per trasformare i dati. Applicalo su larga scala e hai la programmazione. In questo contesto le sue critiche hanno molto senso. STL (e modelli di progettazione) suggeriscono che anziché esaminare i dati per trovare una soluzione, esaminiamo le soluzioni nella nostra borsa di trucchi per trovarne una che funzioni con i dati. Non intendo parlare per Mike, ma credo che suggerirebbe che questo modo di affrontare il problema sia arretrato e che possa potenzialmente portare a soluzioni inefficienti o gonfie.
Dan Olson,

19

Se ti ritrovi a riscrivere qualcosa che esiste già nell'STL, per qualsiasi motivo, fermati . Usa STL.

L'STL è stato ottimizzato in anni di analisi e tempo, ed è una scommessa sicura che probabilmente non hai intenzione di scrivere qualcosa che sia più efficiente. Questo non vuol dire che dovresti usare STL dove potrebbe essere possibile una soluzione più semplice (cioè usa un array quando hai una quantità nota di cose, non una stl :: list), ma se stai scrivendo la tua implementazione di una mappa ( la struttura dei dati di base, non una mappa del mondo di gioco), stai sbagliando.


7
map <> non è quasi mai quello che vuoi usare per qualsiasi memoria o CPU efficiente nel contesto di un gioco. hash_map <> è quasi sempre una scelta migliore, anche se le prestazioni di hash_map differiscono notevolmente con il fornitore. Se stai costruendo un gioco per console o con funzionalità di rete scalabili, STL può essere assolutamente troppo lento o gonfio per i tuoi scopi.
Ben Zeigler,

3
unordered_map <> è ora ampiamente disponibile e presenta requisiti di prestazioni estremamente rigorosi nell'attuale bozza TR1. (Al punto di un'eccessiva specificazione penso - proibisce persino di aprire l'hash, e mentre di solito è più lento, non penso che dovrebbe essere assolutamente proibito dallo standard.)

5
L'STL offre algoritmi e contenitori. Non c'è mai un motivo per non usare la versione stl di un algoritmo. Ad esempio, std::sortgeneralmente usa l'introsort sottostante, incredibilmente veloce e abbastanza complesso da non voler farlo da solo.
deft_code

la verità è unordered_mapin C ++ 11 o boost sono entrambi troppo lenti, quello che vuoi è una mappa hash con indirizzo aperto, come google :: sparse_map o la tua.
v.oddou,

16

STL è adatto ai giochi? Decisamente. I giochi sono complessi software, l'STL offre funzionalità che aiutano a gestire la complessità, quindi è buono.

È adatto alla tua piattaforma? Non necessariamente. Se stai scrivendo per una console, devi fare molta attenzione all'utilizzo della memoria e della cache. L'STL non lo rende molto semplice.

Penso che troppo spesso scambiamo "giochi" per "giochi in tempo reale ad alte prestazioni che girano su hardware incorporato o su misura", ma è importante fare una distinzione. Se stai scrivendo un gioco per Windows che non sta cercando di essere eseguito a schermo intero a 60 fps costanti, non c'è motivo di evitare gli strumenti offerti dalla libreria standard.


10

So che è molto tardi per la festa, ma il tempo cambia e le risposte rimangono in giro. C ++ 11 presenta cambiamenti piuttosto ampi, molti dei quali aumentano le prestazioni del C ++ e della libreria standard. Sembra che coloro che non usano STL o Boost, tendano a non tenere il passo con i nuovi standard, lasciando le soluzioni filate a casa prive di importanti miglioramenti, ovviamente non è sempre così.

Ho usato STL su tutti i progetti dalla metà degli anni '90 ad oggi, ad eccezione di un breve periodo presso EA. Penso che il lato anti-STL avesse delle ragioni marginalmente razionali per non usarlo. Quelli sono in gran parte spariti. Gli allocatori personalizzati sono una soluzione, l'utilizzo di reserve è un'altra e non passare le cose in base al valore è un terzo, ma questi sono piuttosto semplici e qualsiasi programmatore dovrebbe saperli. Ancora più importante è l'uso di algoritmi. Gli autori di compilatori sanno esattamente cosa fa un for_each () e possono ottimizzare il codice. Ciò non può accadere con un ciclo home rolled. for_each () su un oggetto const è ancora meglio. Microsoft ottimizza for_each in molti modi, inclusa la serializzazione. Hanno anche la libreria AMP che ha parallel_for_each (). Se ne hai la possibilità, parla con gli ingegneri del compilatore. I compilatori di console ottimizzeranno ciò che viene utilizzato, quindi un po 'di problema con pollo e uova. Microsoft sta andando molto pesante con C ++ 11 e il prossimo XBox non sarà diverso. Non ho idea di PS4, non ne abbiamo ancora uno.

Gli allocatori personalizzati sono un modo per gestire il problema di memoria, ma un'altra opzione (spesso trascurata) è quella di utilizzare il nuovo ed elimina basato sulla classe. In questo modo si possono ottenere enormi aumenti delle prestazioni.

L'idea che Boost e STL abbiano una visione ristretta della risoluzione dei problemi è pura follia. Sono sbalordito da quante cose in STL e Boost sono personalizzabili attraverso tratti e politiche. Cerca un confronto tra maiuscole e minuscole come esempio.

Per quanto riguarda i tempi di collegamento lunghi e il bloat del codice, il nuovo modello extern dovrebbe aiutare in questo. Generalmente trovo che i tempi di compilazione lunghi derivino dall'accoppiamento eccessivo e dall'uso improprio di pch.

Il motivo più convincente per utilizzare STL su homespun è che ci sono milioni di persone che possono aiutarti con l'STL. Come sempre, non ottimizzare prematuramente e testare, testare, testare.


idee interessanti; cosa intendi con " usa il nuovo basato sulla classe ed elimina "? Vuoi dire, accelerare un processo usando oggetti già presenti nell'heap?
johnbakers,

9

Questo è un argomento caldo nello sviluppo del gioco. Personalmente non lo consiglio, tranne forse per l'EASTL come menzionato sopra. Ho due problemi principali con STL (tecnicamente "The C ++ Standard Library", poiché STL non è più il nome) nei giochi. 1) L'allocazione dinamica della memoria spesso spreca molto tempo di esecuzione nei giochi quando si utilizza STL. 2) L'uso di STL incoraggia un approccio di array di strutture all'architettura di gioco, mentre un approccio di struttura di array è molto più intuitivo per la cache.


Come menzionato altrove, è possibile fornire allocatori personalizzati per le classi del contenitore, che possono utilizzare liste di scelta se si desidera (array preallocati). La matrice di strutture e la struttura di array dipende molto da ciò che stai cercando di fare: non esiste una regola rigida e rapida su quale sia il migliore.
Skizz,

Apprezzo il tuo punto che è importante capire bene il problema che stai risolvendo. Ma con rispetto, penso ancora di non essere d'accordo con la tua conclusione. Ogni problema presenta modelli di utilizzo che non possono essere espressi agli allocatori STL personalizzati, ma che possono essere facilmente sfruttati in un contenitore personalizzato, come un allocatore a blocchi fissi implementato con un array piatto. E l'applicazione di una trasformazione fissa su una matrice di tipi omogenei porterà molto probabilmente a una coerenza della cache molto migliore rispetto all'iterazione su un vettore di tipi polimorfici e all'invocazione di metodi virtuali.
Terrance Cohen,

5

Dipende. Quanto è grande il progetto, quale piattaforma (e) e quale è la sequenza temporale?

Se stai lavorando su un grande progetto, su piattaforme con risorse limitate, con una linea temporale e un budget significativi, puoi risparmiare un sacco di problemi evitando l'inevitabile inferno che guarderà una base di codice di mezzo milione di righe che è disseminato di STL, non può mantenere un framerate superiore a 30, mangia abbastanza RAM per adattarsi a molte altre risorse e richiede 2 ore per essere costruito.

In altre situazioni, tuttavia, STL e persino Boost possono essere molto utili se applicati in modo appropriato. Ho lavorato su titoli che utilizzavano una selezione di STL / Boost ed erano un sogno assoluto per cui codificare: meno bug / perdite e codice facile da mantenere significa più tempo per scrivere nuove divertenti funzioni! Soprattutto per i progetti di hobby, questa è una grande vittoria nel settore della motivazione.

Scopri quando scambiare le prestazioni per comodità!


1
"Sapere quando scambiare performance per comodità". Sì. Solo questa frase è una risposta valida come una qualsiasi. Scopri cosa devi ottenere con il tuo gioco, consulta i colleghi e decidi se STL ti aiuterà ad arrivarci o a ostacolarti. Direi che se non stai cercando di impostare la barra della grafica e delle prestazioni di nuova generazione con il tuo gioco, probabilmente STL ti aiuterà.
gkimsey,

4

IMHO direi che è una buona scelta poiché STL funziona già bene ed è ottimizzata per i compiti per cui è stata realizzata. Inoltre, stai lavorando a un gioco, quindi usa gli strumenti che hai a portata di mano che ti semplificano la vita e che il tuo codice è meno soggetto a bug.

Perché preoccuparsi di reinventare la ruota quando puoi lavorare su qualcos'altro come l'intelligenza artificiale del gioco, l'esperienza utente o ancora meglio; test e debug?


2
In pratica, verso la fine di un progetto, le prestazioni tendono ad essere un problema critico. Se usi STL, hai pochissime opportunità di ottimizzazione perché prende le tue applicazioni specifiche e le risolve in modo generale. Risolvere casi specifici in un modo specifico (e senza allocazione dinamica della memoria) ha quasi sempre prestazioni più elevate.
Terrance Cohen,

2
Ma se non si desidera l'allocazione dinamica della memoria, non si dovrebbe usare STL. Questo è il punto. Il tuo codice non sarà migliore e potrebbe sicuramente essere molto peggio. La decisione di progettazione di utilizzare in modo improprio l'STL è il problema qui, non l'STL, le sue capacità o le sue caratteristiche perf. Stai attaccando la parte sbagliata del problema.
Ed Ropple,

4

STL è assolutamente perfetto per l'uso nei giochi, purché tu lo capisca bene. Il nostro motore ne fa un uso piuttosto esteso e non è mai stato un problema. Non ho alcuna esperienza con lo sviluppo della console, che potrebbe essere una storia completamente diversa, ma è ben supportato su tutte le piattaforme PC (Windows / Mac / Linux).

La cosa più importante è capire quali sono i punti di forza e di debolezza di ogni tipo di contenitore e scegliere il contenitore corretto per il lavoro che stai facendo.


4

Il mio ex datore di lavoro è passato dall'uso di un solido set di classi di container personalizzate a STL. I tempi di costruzione sono aumentati e la facilità di debug è diminuita, entrambi in modo piuttosto significativo. Se avessimo iniziato da zero, STL (forse meglio utilizzato) avrebbe probabilmente avuto senso, ma non mi è mai stato chiaro che abbiamo ottenuto qualcosa nel passaggio a STL che giustificherebbe il lancio di codice funzionante, veloce e di debug.

Per i miei progetti personali, se STL si adatta o meno dipende dal progetto. Se sto provando a fare un lavoro ottimizzato per l'accesso ai dati e alla cache in stile Mike Acton, penserò almeno a far rotolare le mie strutture di dati personalizzate. Se sto prototipando alcuni algoritmi o gameplay e non mi preoccupo di prestazioni, scalabilità, piattaforma di destinazione, ecc. Prenderò automaticamente STL.


4

I miei 2 centesimi su questo è che l'STL funziona perfettamente. Ho sviluppato un motore di gioco 3D (non di qualità AAA, ma abbastanza avanzato: tipi di entità con script, renderer differito, fisica Bullet integrata) per PC e non ho ancora visto i contenitori diventare il principale collo di bottiglia. L'utilizzo errato dell'API 3D e gli algoritmi scadenti sono stati gli obiettivi migliori (determinati dalla profilazione!) Ogni volta che sono entrato e ho cercato di ottenere un po 'più di prestazioni.


3

Ho creato giochi usando STL e mi piace, e sembra funzionare bene.


3

Buona domanda! Una domanda più specifica è quali sono alcuni requisiti comuni che un gioco avrebbe che non può essere soddisfatto con STL e Boost.

Nella mia esperienza, i rigidi limiti di memoria dell'hardware della console rendono qualsiasi tipo di contenitore di dimensioni dinamiche una cattiva idea indipendentemente da quanto sia intelligente l'allocatore personalizzato. I contenitori che non hanno limiti deliberati incoraggiano i programmatori a scrivere codice che non limiti i limiti dei loro set di dati. A seconda delle innumerevoli variabili che sono difficili da tracciare, potresti superare i limiti di memoria. Ho la sensazione che questa sia una delle principali cause di instabilità nei giochi moderni.

Inoltre, l'uso eccessivo di modelli può portare a tempi di compilazione molto lunghi in una base di codice di grandi dimensioni e gonfia le dimensioni dell'eseguibile in modo che non si adatti più alla cache, per esempio, di un nucleo ausiliario su una ps3.

Tuttavia, per lo sviluppo solo su PC penso che STL e Boost siano molto buoni. Sebbene le soluzioni del caso generale non siano sempre ideali, spesso sono abbastanza buone. La tua prima soluzione a un problema non è quasi mai l'ideale e tu migliora o sostituisci le inadeguatezze fino a quando non è abbastanza buono.


2

L'STL è adatto per il tuo gioco se l'STL è adatto per il tuo gioco.

Come per tutte le scelte tecnologiche fatte durante lo sviluppo, è necessario valutare i pro ei contro: il rotolamento della mia libreria mi offrirà un utilizzo della memoria, prestazioni e produttività più vantaggioso rispetto al semplice utilizzo dell'STL? Possibilmente; sebbene sia altrettanto facile creare vectorun'implementazione che utilizza più memoria, è più lenta e richiede grandi quantità di manutenzione per rimanere funzionale rispetto a ciò che già esiste.

Le persone non dovrebbero evitare di usare l'STL nei loro giochi perché altre persone evitano di usare l'STL nei giochi; dovrebbero evitare di usarlo se hanno valutato tutte le loro opzioni e credono sinceramente che un'altra implementazione migliorerà la qualità del loro prodotto.


2
Sono d'accordo al 100% con l'ultima parte del tuo commento, ma andrei ancora oltre: se puoi dimostrare in modo conclusivo perché l'STL non è una buona opzione, non utilizzare l'STL. Altrimenti, fallo. Il culto del carico (tutto da "oh, gli sviluppatori di giochi usano il C ++!" A "oh, gli sviluppatori di giochi non usano l'STL!") Non è salutare. Tuttavia, vorrei sollevare un po 'di problemi con il tuo secondo paragrafo: è abbastanza improbabile che le persone che sono ancora abbastanza ingenue da pensare di reimplementare la STL sia una buona idea costruiranno una migliore vectordella gente della STL. Quando puoi farlo, non pensi più di doverlo fare! :-)
Ed Ropple,

2

Come per la maggior parte delle domande, la risposta non è mai "sì o no", bianco o nero. STL è adatto per alcuni problemi, usarlo per quei problemi dovrebbe andare bene. È un errore presumere che sia inutile, ma è anche un errore presumere che sia opportuno utilizzarlo in ogni situazione.

Il problema più grande a cui prestare attenzione quando si utilizza STL nello sviluppo del gioco è l'allocazione della memoria. Gli allocatori predefiniti di STL non sembrano adattarsi bene alle strategie di allocazione preferite per lo sviluppo del gioco. Naturalmente gli allocatori personalizzati possono essere usati, ma questo rende l'idea meno allettante se stai considerando se aggiungere STL a una base di codice non STL.

Aggiungete a ciò che se la vostra base di codice non è STL, potreste non avere abbastanza familiarità con i concetti STL o template per implementare correttamente gli allocatori personalizzati.


2

Penso che questa discussione possa essere riassunta come segue:

codice specifico per l'applicazione scritto in modo mediocre <codice per scopi generici ben scritto <codice specifico per l'applicazione ben scritto

Chiunque la cui soluzione di coltivazione domestica rientri nella categoria 3 sicuramente conosce la risposta alla domanda originale per il loro problema specifico. Lo STL rientra nella categoria 2. Quindi, per qualcuno che ha bisogno di porre la domanda, "dovrei io usare lo STL", la risposta è probabilmente sì.


2

STL è perfetto per l'uso su un PC, perché il suo avanzato sistema di memoria virtuale rende la necessità di un'attenta allocazione della memoria un po 'meno cruciale (anche se si deve ancora stare molto attenti). Su una console, con strutture di memoria virtuale limitate o assenti e costi esorbitanti di mancata memorizzazione nella cache, è probabile che tu stia meglio scrivendo strutture di dati personalizzate che hanno pattinazioni prevedibili e / o limitate di allocazione della memoria. (E certamente non andrai molto male facendo lo stesso su un progetto di gioco per PC.)


1

Penso che questa domanda sia davvero una domanda più grande e non posta - dovrei usare X nella mia Y ? E l'unico modo per rispondere veramente è provarlo tu stesso. Per ogni persona che trovi che dice che X funziona alla grande, troverai qualcuno che dice che è orribile. Ed entrambi sono giusti - per il loro progetto.

La cosa grandiosa del software, a differenza della maggior parte delle altre discipline, è che puoi sempre cambiare le cose in seguito se scopri che non funziona come vorresti. Scopri in seguito che STL non funziona per te in questo progetto? Strappalo, metti qualcos'altro al suo posto. Non ti piace come hai diviso i compiti tra i tuoi oggetti? Refactor. Non ti piace che hai usato oggetti? Sostituiscili con metodi C diritti. Non ti piace che tutto venga archiviato in strutture e metodi per manipolarli? Sostituiscili con oggetti C ++.


1
Mentre hai ragione, può esserci un'enorme penalità per il refactoring; quindi prendere una decisione informata in anticipo anziché arbitraria ti farà risparmiare tempo nel lungo periodo.
Alan,

1

Dico no allo STL. La mia ragione è abbastanza semplice:

  1. Non è necessario l'STL per scrivere giochi. Neanche quelli grandi.
  2. STL aumenta notevolmente i tempi di compilazione.
  3. I tempi di compilazione di grandi dimensioni comportano meno iterazioni sullo sviluppo.

Ritengo che il conteggio delle iterazioni sia della massima importanza, quindi sto solo alla larga dalla STL e da qualsiasi altra tecnica di sviluppo che rallenta le iterazioni (come l'architettura per il gusto di farlo, o i linguaggi di script che devono essere compilati).

Le costose iterazioni portano a enormi team di sviluppo di persone che cercano di fare cose con pochissimo successo. L'ho visto e ascoltato, e uno dei colpevoli sembra essere tempi di compilazione per le librerie di modelli.


1
Sono d'accordo sui tempi di compilazione. Qualsiasi significativo tempo di compilazione raddoppia la quantità di lavoro perso; ad esempio se la compilazione dura 5 minuti, trascorrerai 10 minuti a prendere il caffè ogni volta. ;)
Ipsquiggle,

Mentre vedo entrambe le parti di questo argomento, devo dire che sono pienamente d'accordo con il tuo argomento, Richard. +1.
Ingegnere,
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.