2010-04-27 20 views
18

He estado leyendo algunos libros de juegos. Y siempre prefieren crear el motor como una biblioteca estática sobre un enlace dinámico. Soy nuevo en C++, así que no tengo mucho conocimiento cuando se trata de bibliotecas estáticas y bibliotecas de enlaces dinámicos. Todo lo que sé es que las bibliotecas estáticas aumentan el tamaño de su programa, donde las bibliotecas de enlaces DLL se cargan cuando las necesita dentro de su programa.por qué los motores de juegos prefieren bibliotecas estáticas sobre bibliotecas de vínculos dinámicos

[editar]

He jugado juegos en los que casi parecía que utilizan los DLL para cargar en el sonido, la iluminación, y lo que no de forma individual. como el nivel se estaba cargando. porque no necesariamente necesitas eso cuando estás en el menú del juego.

+1

Es mucho más probable que simplemente carguen los activos de arte + sonido cuando los necesitan, en lugar de elegir cargar los archivos DLL en un momento posterior.En general, necesita toda su funcionalidad desde el principio, pero no todos sus datos. – Kylotan

Respuesta

18

Las bibliotecas de vínculos dinámicos necesitan ser independientes de la posición; esto puede causar ineficiencias de rendimiento en algunas arquitecturas de procesador.

Las bibliotecas estáticas se pueden optimizar cuando se incluyen en su programa, por ejemplo, eliminando el código muerto. Esto puede mejorar el rendimiento de la memoria caché.

+0

Ok, dijiste que necesitan posicionarse de manera independiente. Definir posición independiente. porque como lo miro Tanto las DLL como las bibliotecas estáticas se considerarían independientes, en términos de que no pertenecen al juego inicial. Cuando usa bibliotecas estáticas. Estás cargando todos sus contenidos. Entonces, ¿cómo se puede pelar con el código muerto? – numerical25

+6

La biblioteca estática está vinculada con su ejecutable en el tiempo de compilación/enlace; el vinculador conoce la dirección de carga del código de biblioteca estática y puede optimizarlo. El vinculador también sabe a qué funciones de la biblioteca se hace referencia, y puede eliminar las funciones a las que no se hace referencia. La biblioteca dinámica está vinculada en tiempo de ejecución y puede ser compartida por varios procesos, por lo que la dirección no se conoce a priori, ni se puede mover la biblioteca. La biblioteca dinámica tiene puntos de entrada que se pueden usar dinámicamente (duh) ;-), por lo que no se puede eliminar ningún código de la huella de memoria. –

+2

Por "posición independiente" quiero decir que el código debe poder ejecutarse sin importar dónde esté cargado en la memoria. Esto implica el uso de saltos relativos y referencias de datos basadas en punteros (o referencias de datos relativos a PC). Los cargadores muy inteligentes pueden hacer algo de trabajo en el momento de la carga para minimizar el impacto. Sin embargo, el código estático se puede compilar y vincular para usar direcciones conocidas para datos y códigos. –

7

Por posición independiente, significa que dado que el motor del juego y el DLL están completamente separados, el DLL es autónomo y no puede entrelazarse en el código del motor del juego, mientras que enlazar estáticamente una biblioteca permite al compilador optimizar usando ambos código del motor del juego Y el código de la biblioteca.

Por ejemplo, supongamos que hay una pequeña función que el compilador cree que debe estar en línea (copiada directamente en lugar de una llamada a la función). Luego, con una biblioteca estática, el compilador podría insertar este código, ya que sabe cuál es el código (está enlazando en tiempo de compilación). Sin embargo, con una biblioteca dinámica, el compilador no podría alinear ese código, ya que no conoce cuál es el código (ya que se vinculará en el tiempo de ejecución).

+0

La alineación no es la razón por la que las bibliotecas dinámicas son más lentas. La mayoría de los compiladores + vinculadores no incorporan funciones en todos los archivos. En realidad, programo en un lenguaje donde el compilador se inserta en todos los archivos, y la consiguiente falta de una verdadera compilación independiente me molesta infinitamente. –

+0

Es cierto. Acabo de presentar la publicación como un ejemplo de algo que podría hacerse _posiblemente_ con bibliotecas estáticas, en lugar de dinámicas, para dar un ejemplo más concreto. – foxwoods

+1

Visual Studio tiene una optimización de todo el programa que se integrará felizmente en todos los archivos y probablemente en todas las bibliotecas. Me sorprendería si gcc no tuviera algo similar (aunque la mayoría de los juegos no se compilarán en gcc). – Kylotan

2

Otra cuestión cubre las diferencias entre las bibliotecas estáticas y dinámicas: When to use dynamic vs. static libraries

En cuanto a por qué utilizan las bibliotecas estáticas, la velocidad extra puede valer la pena y se puede evitar el infierno DLL (era un gran problema en el pasado) . También es útil si desea distribuir el programa y las bibliotecas, asegurándose de que el destinatario tenga las dependencias correctas, aunque no hay nada que le impida distribuir archivos DLL junto con el ejecutable.

1

Otra razón que a menudo se pasa por alto y que merece mención es que para muchos juegos no se van a ejecutar muchas otras cosas, y muchas bibliotecas que se usan para juegos no se van a usar para las otras cosas que puede estar ejecutándose al mismo tiempo que un juego, por lo que no tiene que preocuparse por uno de los aspectos positivos más importantes que obtiene del uso de bibliotecas compartidas, que es que solo una copia de (la mayoría de) la biblioteca debe cargarse en uno tiempo, mientras que varias cosas pueden hacer uso de esa copia. Cuando ejecutas un juego, probablemente solo tengas un programa que quiera usar esa biblioteca de todas formas porque probablemente no estarás ejecutando muchos otros programas (particularmente otros juegos o programas 3D) al mismo tiempo.

También se abre la posibilidad de optimización global/tiempo de enlace, que es mucho más difícil con bibliotecas compartidas.

2

Al desarrollar juegos para una consola, a menudo los enlaces dinámicos no son una opción. Si desea utilizar el motor para el desarrollo tanto de la consola como de la PC, lo mejor sería evitar la vinculación dinámica.

Cuestiones relacionadas