En general, no maneja la falta de memoria. La única opción sensata en un software tan grande y complejo como un juego es simplemente bloquear / afirmar / terminar en su asignador de memoria lo antes posible (especialmente en las compilaciones de depuración). Las condiciones de falta de memoria se prueban y manejan en algunos software de sistema central o software de servidor en algunos casos, pero no en otros lugares.
Cuando tienes un límite de memoria superior, solo asegúrate de nunca necesitar más que esa cantidad de memoria. Puede mantener un número máximo de NPC permitidos a la vez, por ejemplo, y simplemente dejar de generar nuevos NPC no esenciales una vez que se alcanza ese límite. Para los NPC esenciales, puede hacer que reemplacen los no esenciales o tener un grupo / límite separado para los NPC esenciales que sus diseñadores saben diseñar (por ejemplo, si solo puede tener 3 NPCsa esenciales, los diseñadores no pondrán más de 3 en un área / fragmento: buenas herramientas ayudarán a los diseñadores a hacer esto correctamente y las pruebas son esenciales, por supuesto).
Un sistema de transmisión realmente bueno también es importante, especialmente para los juegos de sandbox. No es necesario mantener todos los NPC y elementos en la memoria. A medida que te mueves por trozos del mundo, se introducirán nuevos fragmentos y fragmentos antiguos. Estos generalmente incluirán NPC y artículos, así como el terreno. El diseño y los límites de ingeniería en los límites de elementos deben establecerse teniendo en cuenta este sistema, sabiendo que a lo sumo X se conservarán trozos viejos y se cargarán proactivamente Y se cargarán trozos nuevos, por lo que el juego debe tener espacio para guardar todos los datos de los fragmentos X + Y + 1 en la memoria.
Algunos juegos intentan manejar situaciones de falta de memoria con un enfoque de dos pasos. Teniendo en cuenta que la mayoría de los juegos tienen muchos datos almacenados en caché técnicamente innecesarios (por ejemplo, los fragmentos anteriores mencionados anteriormente) y una asignación de memoria podría hacer algo como:
allocate(bytes):
if can_allocate(bytes):
return internal_allocate(bytes)
else:
warning(LOW_MEMORY)
tell_systems_to_dump_caches()
if can_allocate(bytes):
return internal_allocate(bytes)
else:
fatal_error(OUT_OF_MEMORY)
Esta es una medida de última parada para hacer frente a situaciones inesperadas en el lanzamiento, pero durante la depuración y las pruebas, probablemente debería bloquearse inmediatamente. No querrás tener que depender de este tipo de cosas (especialmente porque deshacerse de los cachés puede tener algunas consecuencias serias en el rendimiento).
También puede considerar descargar copias de alta resolución de algunos datos, por ejemplo, puede volcar los niveles de texturas mipmap de mayor resolución si se está quedando sin memoria GPU (o cualquier memoria en una arquitectura de memoria compartida). Sin embargo, esto generalmente requiere mucho trabajo arquitectónico para que valga la pena.
Tenga en cuenta que algunos juegos de sandbox muy ilimitados se pueden bloquear fácilmente, incluso en PC (recuerde que las aplicaciones comunes de 32 bits tienen un límite de 2-3 GB de espacio de direcciones, incluso si tiene una PC con 128 GB de RAM; un 64- bit OS y hardware permiten que más aplicaciones de 32 bits se ejecuten simultáneamente, pero no pueden hacer nada para que un binario de 32 bits tenga un espacio de direcciones más grande). Al final, tienes un mundo de juego muy flexible que necesitará un espacio de memoria ilimitado para ejecutarse en todos los casos o tienes un mundo muy limitado y controlado que siempre funciona perfectamente en la memoria limitada (o algo intermedio).