esta es una pregunta "difícil". No he encontrado nada interesante en la web.C++ Memory Management for Texture Streaming in Videogames
Estoy desarrollando un módulo de gestión de memoria para mi empresa. Desarrollamos juegos para consolas de nueva generación (Xbox 360, PS3 y PC ... ¡consideramos PC una consola!).
Necesitaremos en el futuro, para nuestros próximos juegos, manejar la transmisión de texturas para mundos de juegos grandes que no pueden cargarse todos en la memoria de la consola principal (por ahora no se trata de PC).
Vamos a transmitir en el principio mipmaps de alta resolución de texturas (que es aproximadamente el 70% del tamaño de los datos mundiales). Tal vez en el futuro tengamos que transmitir también geometría, mipmaps más pequeños, audio, etc.
Estoy desarrollando un Administrador de memoria para ese tema, enfocado en X360 (porque a través de PS3 podemos usar la memoria del host y el asociado , autodefragmentando el asignador GMM).
El problema que estoy enfrentando es el siguiente: hemos decidido reservar un área de memoria específica para la transmisión de textura (por ejemplo, 64 megabytes) y queremos manejar todas las asignaciones y desasignaciones en esa área. Hemos asignado el área al principio de la aplicación y el área está Físicamente garantizada que es contigua (no solo virtualmente, porque necesitamos almacenar texturas allí).
Implementé un asignador de desfragmentación automático, usando identificadores en lugar de punteros. El tiempo no es un problema, el problema es la fragmentación de la memoria. En el juego, continuamente cargamos y descargamos los objetivos de transmisión, por lo que nos gustaría utilizar la cantidad máxima de nuestro búfer (64 megabytes).
Con este asignador podemos usar todo el espacio asignado pero la rutina de desfragmentación funciona en un tiempo inaccesible (a veces 60 milisegundos, ¡más que un fotograma!) Mientras que el algoritmo no está tan mal ... simplemente son demasiado mengosos ¡memcpy incurable!
Estoy buscando una solución para resolver este problema. Me gustaría encontrar al menos un buen artículo, una autopsia o alguien que haya tenido el mismo problema.
Ahora estoy eligiendo entre dos estrategias: 1) mover la rutina de desfragmentación en un subproceso dedicado (bueno para X360 con 6 subprocesos de hw, malo para PS3 con solo un subproceso de hw ... y no me digas para usar SPU's) con todos los problemas de multihilo de regiones de bloqueo, de acceso a una región que se está moviendo, ... 2) encontrar una solución "incremental" al problema de desfragmentación: podemos dar a cada marco un presupuesto de tiempo (por ejemplo, hasta a 1 milisegundo) para la desfragmentación y el Administrador de memoria hará lo que puede hacer en el presupuesto de cada cuadro.
¿Puede alguien contarme su experiencia?
Como programador de juegos Secundo esta idea, estamos texturas suerte Game tienen buenos tamaños, por defecto por lo que debería funcionar bien, pero también puede que quiera usar un cubo par tamaños en lugar de un solo cubo. Ahora, otra optimización a considerar es crear un algoritmo que coloque las texturas que se utilizarán en el mismo paso de renderización una al lado de la otra, pero no hará una diferencia increíblemente grande, tal vez simplemente recordar y optimizar si realmente lo necesita, depender de la juego y renderizado. –
excelente enlace, ¡excelente respuesta! ¡Muchas gracias! – ugasoft
este es uno de los mejores enlaces que he encontrado hasta ahora. Muchas gracias. – pigiuz