In generale, non gestisci la memoria insufficiente. L'unica opzione sana in un software grande e complesso come un gioco è semplicemente arrestare / affermare / terminare il proprio allocatore di memoria il più presto possibile (specialmente nelle build di debug). Le condizioni di memoria insufficiente vengono testate e gestite in alcuni software di sistema di base o software server in alcuni casi, ma in genere non altrove.
Quando hai un limite di memoria superiore, ti assicuri invece di non aver mai bisogno di più di quella quantità di memoria. Puoi mantenere un numero massimo di NPC consentiti alla volta, ad esempio, e semplicemente smettere di generare nuovi NPC non essenziali una volta colpito quel limite. Per gli NPC essenziali puoi farli sostituire quelli non essenziali o avere un pool / cap separato per gli NPC essenziali che i tuoi progettisti sanno progettare intorno (ad esempio se puoi avere solo 3 NPCsa essenziali, i progettisti non ne inseriranno più di 3 in un'area / pezzo - buoni strumenti aiuteranno i progettisti a farlo correttamente e i test sono ovviamente indispensabili).
Un ottimo sistema di streaming è importante anche in particolare per i giochi sandbox. Non è necessario conservare tutti gli NPC e gli oggetti in memoria. Mentre ti muovi attraverso pezzi del mondo, nuovi pezzi verranno trasmessi in streaming e vecchi pezzi verranno scaricati in streaming. Questi includeranno generalmente NPC e oggetti, nonché il terreno. Progettare e progettare limiti sui limiti degli oggetti deve essere impostato tenendo presente questo sistema, sapendo che al massimo X vecchi pezzi verranno mantenuti in giro e caricati in modo proattivo Y nuovi pezzi verranno caricati, quindi il gioco deve avere spazio per tenere tutto i dati di X + Y + 1 blocchi in memoria.
Alcuni giochi tentano di gestire situazioni di memoria insufficiente con un approccio a due passaggi. Tenendo presente che la maggior parte dei giochi ha molti dati memorizzati nella cache tecnicamente non necessari (diciamo, i vecchi blocchi sopra menzionati) e un'allocazione di memoria potrebbe fare qualcosa del tipo:
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)
Questa è un'ultima misura per far fronte a situazioni impreviste in fase di rilascio, ma durante il debug e il test probabilmente dovresti semplicemente arrestarti immediatamente. Non devi fare affidamento su questo tipo di cose (soprattutto perché il dumping delle cache può avere conseguenze serie sulle prestazioni).
Potresti anche prendere in considerazione il dumping di copie ad alta risoluzione di alcuni dati, ad esempio potresti scaricare i livelli mipmap ad alta risoluzione di trame se stai esaurendo la memoria GPU (o qualsiasi memoria in un'architettura a memoria condivisa). Questo di solito richiede molto lavoro architettonico per farne valere la pena.
Nota che alcuni giochi sandbox molto illimitati possono essere facilmente bloccati, anche su PC (ricorda che le comuni app a 32 bit hanno un limite di 2-3 GB di spazio degli indirizzi anche se hai un PC con 128 GB di RAM; un 64- bit OS e hardware consentono l'esecuzione simultanea di più app a 32 bit ma non può fare nulla per fare in modo che un binario a 32 bit abbia uno spazio di indirizzi maggiore). Alla fine, o hai un mondo di gioco molto flessibile che avrà bisogno di spazio di memoria illimitato per funzionare in ogni caso o hai un mondo molto limitato e controllato che funziona sempre perfettamente nella memoria limitata (o qualcosa nel mezzo).