Geralmente, você não lida com falta de memória. A única opção sensata em software tão grande e complexo quanto um jogo é simplesmente travar / afirmar / encerrar no seu alocador de memória o mais rápido possível (especialmente em compilações de depuração). As condições de falta de memória são testadas e manipuladas em alguns softwares do sistema principal ou em servidores em alguns casos, mas geralmente não em outros lugares.
Quando você tem um limite de memória superior, apenas garante que nunca precisará de mais do que essa quantidade de memória. Você pode manter um número máximo de NPCs permitidos por vez, por exemplo, e simplesmente parar de gerar novos NPCs não essenciais assim que o limite for atingido. Para NPCs essenciais, você pode substituí-los por outros não essenciais ou ter um pool / limite separado para NPCs essenciais que seus designers sabem projetar (por exemplo, se você pode ter apenas 3 NPCsa essenciais, os designers não colocarão mais do que 3 em uma área / parte - boas ferramentas ajudarão os designers a fazer isso corretamente e o teste é essencial, é claro).
Um sistema de streaming realmente bom também é importante, especialmente para jogos em sandbox. Você não precisa manter todos os NPCs e itens na memória. À medida que você avança por partes do mundo, novas partes serão inseridas e partes antigas serão exibidas. Isso geralmente inclui NPCs e itens, além de terrenos. Os limites de projeto e engenharia nos limites de itens precisam ser definidos com esse sistema em mente, sabendo que no máximo X trechos antigos serão mantidos ao redor e carregados de forma proativa Y serão carregados novos trechos, para que o jogo precise ter espaço para manter tudo os dados de pedaços X + Y + 1 na memória.
Alguns jogos tentam lidar com situações de falta de memória com uma abordagem de duas passagens. Lembre-se de que a maioria dos jogos possui muitos dados em cache tecnicamente desnecessários (por exemplo, os blocos antigos mencionados acima) e uma alocação de memória pode fazer 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 é uma medida de última parada para lidar com situações inesperadas no lançamento, mas durante a depuração e teste, você provavelmente deve travar imediatamente. Você não precisa depender desse tipo de coisa (especialmente porque o descarte dos caches pode ter sérias conseqüências de desempenho).
Você também pode considerar despejar cópias de alta resolução de alguns dados, por exemplo, pode despejar os níveis de texturas mipmap de maior resolução se estiver com pouca memória GPU (ou qualquer memória em uma arquitetura de memória compartilhada). Isso geralmente requer muito trabalho arquitetônico para fazer valer a pena, no entanto.
Observe que alguns jogos sandbox muito ilimitados podem ser facilmente travados, mesmo no PC (lembre-se de que os aplicativos comuns de 32 bits têm um limite de 2-3 GB de espaço de endereço, mesmo se você tiver um PC com 128 GB de RAM; O SO e o hardware de bit permite que mais aplicativos de 32 bits sejam executados simultaneamente, mas não podem fazer nada para fazer com que um binário de 32 bits tenha um espaço de endereço maior). No final, você tem um mundo de jogo muito flexível que precisará de espaço de memória ilimitado para rodar em todos os casos ou um mundo muito limitado e controlado que sempre funciona perfeitamente na memória limitada (ou algo no meio).