Anche se sono d'accordo con il sentimento: "Non preoccuparti se non è un problema provato", penso che valga la pena di pensarci presto: adattarsi a una soluzione retro è molto più doloroso. E sì, solo l'aggiornamento delle tessere "vicine" è la strada da percorrere. Ma l'archiviazione e l'indirizzamento degli oggetti nel tuo mondo di gioco in modo efficiente è molto importante per motivi di prestazioni.
Quello a cui stai davvero pensando qui è un set di dati scarso: qualcosa in cui i potenziali indici sono grandi (o illimitati), ma solo una piccola parte viene effettivamente utilizzata. Il punto chiave è che non sai esattamente quale proporzione verrà utilizzata.
La soluzione standard a un problema con un set di dati scarso consiste nel separare l'indice / indirizzabilità dall'effettiva memorizzazione dei dati. Quindi, se l'oggetto piastrella è costoso, conservalo in una forma compatta (ad esempio un array piatto). Ma consenti che sia indicizzato attraverso un oggetto più economico. Nella sua forma più semplice, questa può essere una matrice 2D (o 3D) che puoi facilmente indicizzare per coordinata, ma ogni elemento nella matrice è semplicemente un indice. Quindi utilizzare tale indice per cercare il contenuto effettivo del riquadro in un array separato e compatto. Se il contenuto del riquadro non esiste ancora, aggiungerli alla fine dell'array e memorizzare l'indice nella matrice 3D.
La soluzione diventa più complessa se si desidera supportare la cancellazione dei contenuti (in quanto porta alla frammentazione della matrice dei contenuti) e se i contenuti delle tessere sono economici, il peso aggiuntivo dell'indice (indici a 32 o 64 bit) probabilmente travolgerà i risparmi dal non memorizzare ogni singola potenziale piastrella. È anche una ricerca extra, che danneggerà le prestazioni della cache.
È possibile ottenere un'efficienza di archiviazione ancora maggiore introducendo livelli aggiuntivi di indiretta. Supponiamo che organizzi le tue tessere in blocchi e che i blocchi abbiano una granularità di 64x64x64. Data una tessera a 125, 1, 132, sai che appartiene a blocco (1,0,2). Quindi hai un mondo, che consiste in un array di blocchi compatto e una matrice di indici di blocchi (-1 se il blocco non esiste). Il contenuto di ogni blocco (se presente) è una matrice 64x64x64 di indici di tessera (-1 se la tessera non esiste ancora) e una matrice compatta di tessere usate. In questo modo, non si bruciano enormi quantità di indici di tessere per blocchi che non vengono mai utilizzati. Seguendo questo tipo di approccio e selezionando numeri sensibili per la granularità di pezzi, puoi scalare il tuo universo in modo massiccio e tenere sotto controllo l'utilizzo della memoria. In realtà, se rendi i tuoi pezzi 32x32x32,
Puoi anche fare trucchi subdoli, come usare il bit di alto ordine del tuo pezzo o indici di piastrelle per significare qualcosa di speciale. Quindi se una voce nella matrice di tessere ha il bit più alto impostato, allora i 31 bit più bassi non significano un indice di piastrella, invece significano un "indice di curvatura" o qualcosa di simile, e puoi cercarlo in un elenco gestito separatamente per scoprire le coordinate a cui conduce.