Embora eu concorde com o sentimento: "não se preocupe, a menos que seja um problema comprovado", acho que vale a pena pensar desde o início: adaptar uma solução é muito mais doloroso. E sim, apenas atualizando blocos 'próximos' é o caminho a percorrer. Mas o armazenamento e a capacidade de endereçamento de itens no seu mundo de jogo de forma eficiente são muito importantes por razões de desempenho.
O que você realmente está pensando aqui é um conjunto de dados esparsos: algo em que os índices potenciais são grandes (ou ilimitados), mas apenas uma pequena proporção é realmente usada. O ponto principal é que você não sabe exatamente qual proporção será usada.
A solução padrão para um problema escasso de conjunto de dados é separar o índice / endereçamento do armazenamento de dados real. Portanto, se o objeto lado a lado for caro, armazene-o de forma compacta (por exemplo, uma matriz plana). Mas permita que ele seja indexado através de um objeto mais barato. Na sua forma mais simples, pode ser uma matriz 2D (ou 3D) que você pode indexar facilmente por coordenadas, mas cada item da matriz é simplesmente um índice. Você então usa esse índice para procurar o conteúdo real do bloco em uma matriz compacta e separada. Se o conteúdo do bloco ainda não existir, adicione-o ao final da matriz e armazene o índice na matriz 3D.
A solução fica mais complexa se você deseja oferecer suporte à exclusão de conteúdo (pois leva à fragmentação da matriz de conteúdo) e, se o conteúdo do seu bloco é barato, o peso extra do índice (índices de 32 ou 64 bits) provavelmente sobrecarregará as economias por não armazenar todos os blocos em potencial. Também é uma pesquisa extra, que prejudicará o desempenho do cache.
Você pode obter ainda mais eficiência de armazenamento introduzindo camadas extras de indireção. Digamos que você organize seus blocos em blocos, e os blocos têm uma granularidade de 64 x 64 x 64. Dado um bloco em 125, 1, 132, você sabe que ele pertence ao bloco (1,0,2). Portanto, você tem um mundo, que consiste em uma matriz de blocos compacta e uma matriz de índices de blocos (-1 se o bloco não existir). O conteúdo de cada bloco (se presente) é uma matriz de 64x64x64 de índices de bloco (-1 se o bloco ainda não existir) e uma matriz compacta de blocos usados. Dessa forma, você não queima uma quantidade enorme de índices de blocos para pedaços que nunca são usados. Seguindo esse tipo de abordagem e escolhendo números sensíveis para a granularidade de partes, você pode ampliar seu universo massivamente e manter seu uso de memória sob controle. Na verdade, se você criar seus pedaços 32x32x32,
Você também pode fazer truques sorrateiros, como usar a parte superior de seus índices de bloco ou bloco para significar algo especial. Portanto, se uma entrada na matriz de bloco tiver o bit superior definido, os 31 bits inferiores não significam um índice de bloco, em vez disso, significam um 'índice de distorção' ou algo semelhante, e você pode procurar isso em uma lista mantida separadamente para descobrir as coordenadas que ele leva.