En règle générale, vous ne gérez pas la mémoire insuffisante. La seule option sensée dans un logiciel aussi grand et complexe qu'un jeu est de simplement planter / affirmer / terminer dans votre allocateur de mémoire dès que possible (en particulier dans les versions de débogage). Les conditions de mémoire insuffisante sont testées et gérées dans certains logiciels système de base ou logiciels de serveur dans certains cas, mais généralement pas ailleurs.
Lorsque vous avez un plafond de mémoire supérieur, assurez-vous simplement de ne jamais avoir besoin de plus que cette quantité de mémoire. Vous pouvez conserver un nombre maximum de PNJ autorisés à la fois, par exemple, et simplement arrêter de faire apparaître de nouveaux PNJ non essentiels une fois ce plafond atteint. Pour les PNJ essentiels, vous pouvez soit les faire remplacer les non-essentiels, soit avoir un pool / cap séparé pour les PNJ essentiels que vos concepteurs savent concevoir (par exemple, si vous ne pouvez avoir que 3 PNJ essentiels, les concepteurs n'en mettront pas plus de 3 dans une zone / un morceau - de bons outils aideront les concepteurs à le faire correctement et les tests sont bien sûr essentiels).
Un très bon système de streaming est également important, en particulier pour les jeux sandbox. Vous n'avez pas besoin de garder tous les PNJ et objets en mémoire. Au fur et à mesure que vous vous déplacez à travers des morceaux du monde, de nouveaux morceaux seront diffusés et de vieux morceaux diffusés. Ceux-ci incluront généralement des PNJ et des objets ainsi que du terrain. Les limites de conception et d'ingénierie sur les limites des objets doivent être définies en gardant ce système à l'esprit, sachant qu'au plus X anciens morceaux seront conservés et chargés de manière proactive Y de nouveaux morceaux seront chargés, de sorte que le jeu doit avoir de l'espace pour tout garder les données de X + Y + 1 morceaux en mémoire.
Certains jeux tentent de gérer les situations de mémoire insuffisante avec une approche en deux passes. En gardant à l'esprit que la plupart des jeux ont beaucoup de données mises en cache techniquement inutiles (par exemple, les anciens morceaux mentionnés ci-dessus) et une allocation de mémoire pourrait faire quelque chose comme:
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)
Il s'agit d'une mesure de dernier recours pour faire face à des situations inattendues dans la version, mais pendant le débogage et les tests, vous devriez probablement immédiatement planter. Vous ne voulez pas avoir à vous fier à ce genre de choses (surtout parce que le vidage des caches peut avoir de graves conséquences sur les performances).
Vous pouvez également envisager de vider des copies haute résolution de certaines données, par exemple, vous pouvez vider les niveaux de textures mipmap à plus haute résolution si vous manquez de mémoire GPU (ou de toute mémoire dans une architecture à mémoire partagée). Cela nécessite généralement beaucoup de travail architectural pour en valoir la peine.
Notez que certains jeux sandbox très illimités peuvent être assez facilement simplement plantés, même sur PC (rappelez-vous que les applications 32 bits courantes ont une limite de 2-3 Go d'espace d'adressage même si vous avez un PC avec 128 Go de RAM; un 64- le système d'exploitation et le matériel bit permettent à plus d'applications 32 bits de s'exécuter simultanément mais ne peuvent rien faire pour qu'un binaire 32 bits ait un espace d'adressage plus grand). En fin de compte, soit vous avez un monde de jeu très flexible qui aura besoin d'espace mémoire illimité pour fonctionner dans tous les cas, soit vous avez un monde très limité et contrôlé qui fonctionne toujours parfaitement dans la mémoire limitée (ou quelque chose entre les deux).