2011-01-14 25 views
18

Estoy interesado en el tipo de administración de memoria que podría usar un juego como GTA IV ya que necesita crear y eliminar muchos objetos muy rápidamente. ¿Cómo evitar fragmentar el montón y otras cosas? Si alguien pudiera señalarme en la dirección correcta, realmente lo agradecería.¿Cómo los juegos como GTA IV no fragmentan el montón?

+0

http://stackoverflow.com/questions/4687310/memory-allocation-patterns-in-c/4687324#4687324 –

+0

Obtenga una copia de Modern C++ Design. Se le guiará por los pasos para crear un asignador rápido. –

Respuesta

23

Utilizan cosas como memory pooling, asignadores especializados y clases especializadas de contenedores.

  1. El Hoard Memory asignador para programas de subprocesos múltiples.
  2. Versión de EA del STL. Contiene asignadores, contenedores,
+0

agrupación de memoria! sí, olvidé ese término :) – Daniel

1

Creo que debido a que sus objetos son en su mayoría del mismo tamaño, pueden usar un administrador de memoria interna que no libera memoria, pero la marca como disponible y la próxima vez que se asigna un trozo de ~ tamaño lo devuelve.

+0

Eso es lo que hacen las implementaciones simples de 'free()' de todos modos. – Artelius

5

La creación y destrucción de muchos objetos de forma muy rápida no necesariamente significa la fragmentación del montón. A menudo, si los objetos son del mismo tamaño, el espacio liberado por uno se puede asignar para el siguiente.

A menudo, incluso como una optimización, un programa puede no liberar y eliminar memoria para objetos, pero mantener viejos en un grupo y simplemente tomar uno y sobrescribir los contenidos para crear un 'nuevo' objeto.

+0

+1 para la primera oración. Mucha gente habla sobre la fragmentación y no tiene idea de lo que significa. –

7

Si bien este documento no se refiere específicamente a juegos, proporciona una buena recopilación del tipo de asignadores de memoria personalizados que las personas suelen emplear en aplicaciones C y C++ en un intento de mejorar el rendimiento (y es un poco de una historia de advertencia).

Reconsidering custom memory allocation, Berger, Zorn & McKinley, OOPSLA 2002

programadores con la esperanza de lograr mejoras en el rendimiento a menudo utilizan asignadores de memoria personalizado. Este estudio en profundidad examina ocho aplicaciones que usan asignadores personalizados. Sorprendentemente, para seis de estas aplicaciones, un asignador de propósito general de última generación (el asignador de Lea) funciona tan bien o mejor que los asignadores personalizados. Las dos excepciones usan regiones, que ofrecen un mayor rendimiento (mejoras de hasta un 44%). Las regiones también reducen la carga del programador y eliminan una fuente de pérdidas de memoria. Sin embargo, mostramos que la incapacidad de los programadores para liberar objetos individuales dentro de las regiones puede conducir a un aumento sustancial en el consumo de memoria. Peor aún, esta limitación impide el uso de regiones para los modismos de programación comunes, reduciendo su utilidad. Presentamos una generalización de asignadores de propósito general y regional que llamamos cosechas. Las réplicas son una combinación de regiones y montones, que proporcionan un rango completo de semántica de región con la adición de eliminación de objetos individuales. Mostramos que nuestra implementación de cosechas proporciona un alto rendimiento, superando a otros asignadores con una semántica similar a la región. Luego usamos un estudio de caso para demostrar las ventajas del espacio y los beneficios de ingeniería de software de las cosechas en la práctica. Nuestros resultados indican que los programadores que necesitan regiones rápidas deben usar las cosechas, y que la mayoría de los programadores que consideran asignadores personalizados deberían usar el asignador Lea.

+0

Me divierte que la primera respuesta se vincule a tu blog :) –

6

Hay dos muy buenas malloc implementaciones para implementaciones multi-hilo:

  • tcmalloc: por Google
  • jemalloc: utilizado por Apache (por ejemplo)

Aquí está el artículo de Facebook aproximadamente improving jemalloc. Es aproximadamente 5 veces más rápido que el asignador de memoria de Hoard en la respuesta actual actual :)

+0

Ese resultado es bastante anómalo - Espero trabajar con Jason Evans para ver cuál es exactamente el problema. – EmeryBerger

+0

@EmeryBerger: me sorprendió demasiado, ciertamente espero que lo descubras, los buenos asignadores de memoria son el primer ladrillo en compilar el software rápido :) –

1

Muchos juegos usan algunos de los asignadores de memoria mencionados aquí. dlmalloc es uno que hemos utilizado con gran éxito (lo hemos vinculado a Lua). Puede obtener información en dlmalloc here.

Otra cosa que mencionaría es que no todos los juegos tienen que usar la asignación dinámica de memoria. Hemos empleado mempools y el uso de regiones de memoria estática para la mayoría de nuestros datos de juego. Solo los sistemas que requieren asignación dinámica lo hacen (Lua y algunas bibliotecas de terceros). Todo lo demás que hacemos proviene de los búferes estáticos. Tampoco usamos STL en el código de juego, lo que ayuda a limitar el "daño" de la fragmentación de la memoria.

+0

Tenga en cuenta que cualquier sistema operativo real (es decir, un sistema operativo de escritorio/servidor/estación de trabajo excepto Windows) utiliza una asignador que está algorítmicamente muy cerca de 'dlmalloc', con varias * mejoras *, ya. Los únicos sistemas en los que el reemplazo de 'dlmalloc' como' malloc' podría servir para cualquier propósito son Windows y quizás las consolas de juegos (ni idea de cómo son sus bibliotecas). –

+0

Eso no está del todo bien. Los sistemas basados ​​en Linux generalmente usan el asignador glibc, que de hecho se basa en dlmalloc. Sin embargo, Windows, FreeBSD, Solaris, AIX y Mac OS X usan diferentes asignadores de memoria, ninguno de los cuales se basa en dlmalloc. – EmeryBerger

+0

Creo que debería haber aclarado que estaba hablando de sistemas operativos no reales. Dejando a un lado el sesgo personal, mi respuesta vino desde el punto de vista de la ventana y la consola. – Mark

Cuestiones relacionadas