2010-04-27 14 views
18

Ho letto alcuni libri di gioco. E preferiscono sempre creare il motore come libreria statica sul collegamento dinamico. Sono nuovo di C++ quindi non sono molto esperto quando si tratta di librerie statiche e librerie di collegamenti dinamici. Tutto quello che so è che le librerie statiche aumentano le dimensioni del tuo programma, dove le librerie di collegamenti DLL vengono caricate quando ne hai bisogno all'interno del tuo programma.perché i motori di gioco preferiscono librerie statiche su librerie di collegamenti dinamici

[modifica]

Ho giocato giochi in cui sembrava quasi hanno usato DLL per caricare in suoni, luci, e ciò che non tutti singolarmente. mentre il livello si stava caricando. perché non ne hai necessariamente bisogno quando sei nel menu di gioco.

+1

È molto più probabile che caricino le risorse art + sound quando ne hanno bisogno, piuttosto che scegliere di caricare le DLL in un secondo momento.Generalmente hai bisogno di tutte le tue funzionalità fin dall'inizio, ma non di tutti i tuoi dati. – Kylotan

risposta

18

Le librerie di collegamenti dinamici devono essere indipendenti dalla posizione; questo può causare inefficienze nelle prestazioni su alcune architetture di processore.

Le librerie statiche possono essere ottimizzate se incluse nel programma, ad esempio eliminando il codice guasto. Questo può migliorare le prestazioni della cache.

+0

Ok, hai detto che devono essere posizionati in modo indipendente. Definisci la posizione indipendente. perché lo guardo Sia le librerie DLL che quelle statiche sarebbero entrambe considerate indipendenti, in termini che non appartengono al gioco iniziale. Quando si utilizzano le librerie statiche. Stai caricando tutti i suoi contenuti. Quindi, in che modo puoi eliminare il codice morto da esso? – numerical25

+6

La libreria statica è collegata con il tuo eseguibile in fase di compilazione/collegamento; il linker conosce l'indirizzo di caricamento del codice della libreria statica e può ottimizzare per esso. Il linker sa anche quali funzioni della libreria sono referenziate e può rimuovere le funzioni che non sono referenziate. La libreria dinamica è collegata in fase di esecuzione e può essere condivisa da più processi, pertanto l'indirizzo non è noto a priori, né la libreria può essere spostata. La libreria dinamica ha punti di ingresso che possono essere usati dinamicamente (duh) ;-), quindi nessun codice può essere eliminato dal footprint di memoria. –

+2

Per "posizione indipendente" intendo che il codice deve essere in grado di funzionare indipendentemente da dove è stato caricato in memoria. Ciò implica l'utilizzo di salti relativi e riferimenti di dati basati su puntatori (o riferimenti relativi ai dati const relativi al PC). Caricatori molto intelligenti possono fare un po 'di lavoro al momento del caricamento per minimizzare l'impatto. Tuttavia, il codice statico può essere compilato e collegato per utilizzare indirizzi noti per dati e codice. –

7

In posizione indipendente, intende dire che dal momento che il motore di gioco e DLL sono completamente separati, la DLL è stand-alone e non può essere intessuto nel codice motore di gioco, mentre il collegamento staticamente una libreria consente al compilatore di ottimizzare utilizzando sia la vostra codice del motore di gioco E il codice della libreria.

Ad esempio, diciamo che c'è una piccola funzione che il compilatore pensa dovrebbe essere in linea (copiata direttamente al posto di una chiamata di funzione). Quindi con una libreria statica, il compilatore sarebbe in grado di inline questo codice, dal momento che lo conosce il codice (si sta collegando in fase di compilazione). Tuttavia, con una libreria dinamica, il compilatore non sarebbe in grado di inline quel codice, dal momento che lo non conosce il codice (dato che si collegherà in fase di esecuzione).

+0

Inlining non è la ragione per cui le librerie dinamiche sono più lente. La maggior parte dei compilatori + linker non esegue funzioni inline tra i file. In realtà, programma in una lingua in cui il compilatore è in linea tra i file e la conseguente mancanza di una vera raccolta separata mi infastidisce senza fine. –

+0

Vero. Stavo solo presentando inlining come un esempio di qualcosa che potrebbe essere fatto in modo "possibilmente" con le librerie statiche, al contrario di quelle dinamiche, per dare un esempio più concreto. – foxwoods

+1

Visual Studio ha l'intera ottimizzazione del programma che sarà felicemente in linea tra i file e probabilmente anche tra le librerie. Sarei sorpreso se gcc non avesse qualcosa di simile (anche se la maggior parte dei giochi non sarà compilata in gcc). – Kylotan

2

Un'altra domanda riguarda le differenze tra librerie statiche e dinamiche: When to use dynamic vs. static libraries

Per quanto riguarda il motivo per cui usano librerie statiche, la velocità extra può essere valsa la pena e si può evitare DLL hell (era un grosso problema in passato) . È anche utile se vuoi distribuire il tuo programma e le tue librerie insieme, assicurando che il destinatario abbia le dipendenze corrette, anche se non c'è nulla che ti impedisca di distribuire DLL insieme all'eseguibile.

1

Un'altra ragione spesso trascurata che merita di essere menzionata è che per molti giochi non si eseguiranno molte altre cose e molte librerie utilizzate per i giochi non verranno utilizzate per le altre cose che potrebbe essere in esecuzione contemporaneamente a un gioco, quindi non devi preoccuparti di uno dei principali vantaggi derivanti dall'uso delle librerie condivise, ovvero che una sola copia della (la maggior parte) della libreria deve essere caricata in una sola tempo mentre molte cose possono fare uso di quella copia. Quando esegui un gioco, probabilmente avrai solo un programma che vorrebbe usare quella libreria in ogni caso perché probabilmente non eseguirai molti altri programmi (in particolare altri giochi o programmi 3D) allo stesso tempo.

Si apre anche la possibilità di ottimizzazione del tempo globale/di collegamento, che è molto più difficile con le librerie condivise.

2

Quando si sviluppano giochi per una console, spesso il collegamento dinamico non è un'opzione. Se si desidera utilizzare il motore per lo sviluppo di console e PC, è consigliabile evitare il collegamento dinamico.

Problemi correlati