Pergunta

Estou desenvolvendo um jogo para a web. O mapa de este jogo será um mínimo de 2,000 km por 2000 km. Eu quero ser capaz de elevação codificar e tipo de terreno em algum nível de granularidade - 100m X 100m por exemplo.

Para um mapa 2000 km por 2000 km armazenar essa informação em 100m 2 baldes significaria 20000 20000 por elementos ou um total de 400.000.000 de registos numa base de dados.

Existe alguma outra forma de armazenar este tipo de informação?

Mais Informações

O mapa em si nunca vai ser exibido em sua totalidade. Unidades serão movidos no mapa de uma forma turnos e os jogadores vão obter feedback sobre onde eles estão localizados e que a área parece locais como. Terrain irá ditar a velocidade e proibição de circulação.

Eu acho que eu estou tentando dizer que o mapa será usado para o jogo e não necessariamente para uma fins gráficos ou de exibição.

Foi útil?

Solução

Eu tratá-lo de forma diferente, separando tipo de terreno e elevação.

  1. tipo de terreno, presumo, não muda tão rapidamente quanto elevação - provavelmente há setores do mesmo tipo de terreno que se estendem sobre muito mais do que o menor nível de granularidade. Gostaria de mapear os setores em registros de banco de dados ou algum tipo de tabela hash, dependendo do desempenho, memória e outros requisitos.

  2. Elevation Eu diria que é semi-contiuous, como ela muda gradualmente para a maior parte. Gostaria de tentar mapear os valores em conjunto de funções contínuas (diferentes conjuntos entre as partes que não são continua, como na mudança repentina de altitude). Para qualquer conjunto de coordenadas para que o terreno é a mesma elevação ou pode ser descrita por uma função simples, você só precisa definir o intervalo esta função tampas. Isso deve reduzir muito a quantidade de informação que você precisa para gravar para descrever a elevação em cada ponto no terreno.

Então, basicamente eu iria quebrar o mapa em diferentes setores que compõem de (x, y) varia, uma vez para o tipo de terreno e uma vez para elevação do terreno, e construir uma tabela hash para cada uma, que pode retornar o valor apropriado conforme necessário.

Outras dicas

Depende de como você deseja gerar o seu terreno. Por exemplo, você poderia processualmente gerar tudo isso (usando interpolação de um mapa de baixa resolução terreno / altura - armazenado como dois "bitmaps" - com interpolação aleatória semeado a partir as coordenadas xy para garantir que o terreno não metamorfose fez), e usar o armazenamento mínimo . Se você quisesse áreas de terreno que foram completamente definidos, você pode armazenar estes separadamente e usá-los sempre que necessário, gerando aleatoriamente o resto.)

Se você quer completamente terreno definido, então você vai precisar de olhar para algum tipo de compressão / streaming de técnica para só puxar terreno que você está interessado no momento.

Se você quer o tipo de granularidade que você está procurando, então não há nenhuma maneira óbvia de fazê-lo.

Você poderia tentar transformar uma wavelet 2-dimensional, mas que é bastante complexa. Algo como uma transformada de Fourier faria muito bem. Além disso, você provavelmente não iria sobre como armazenar o terreno com uma forma one-record-per-piece-of-terra; faz mais sentido ter algum tipo de campo de banco de dados que pode armazenar uma matriz codificado.

Eu acho que a solução usual é quebrar o seu domínio se em "tiles" de tamanhos gerenciáveis. Você vai ter que adicionar um pouco de lógica para carregar as telhas apropriadas em um determinado momento, mas não muito ruim.

Você não deve precisar de acesso toda essa informação de uma vez -. Mesmo que cada 100m2 balde ocupava um único pixel na tela, sem tela que eu conheço poderia mostrar 20k x 20k pixels de uma só vez

Além disso, eu não usaria um banco de dados - olhar para mapeamento de altura -. Efetivamente usando uma imagem em preto e branco cuja pixels valores representam alturas

Boa sorte!

Isso vai ser terrivelmente muita informação, não importa que forma você olhar para ele. 400.000.000 células da grade vai tomar seu pedágio.

Eu vejo duas maneiras de ir em torno deste. Em primeiro lugar, uma vez que é um jogo baseado na web, você pode ser capaz de obter um servidor com um HDD decentemente e armazenar os 400M registros nele como faria normalmente. Ou, mais provavelmente criar algum tipo de seu próprio mecanismo de armazenamento para a eficiência. Então você só tem que encontrar uma maneira de acessar os dados de forma eficiente, o que poderia ser feito tendo em conta o fato de que você dúvida vai precisar usar tudo de uma vez. ;)

A outra maneira seria algum tipo de compressão. Você tem que ter cuidado com isso embora. A maioria dos algoritmos de compressão de out-of-the-box não permitirá que você para descomprimir um local arbitrário no fluxo. Talvez o seu dados de terreno tem alguns padrões em que você pode usar? Eu duvido que ele vai ser completamente aleatória. O mais provável é Prevejo grandes áreas com os mesmos dados. Talvez aqueles podem ser codificados como tal?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top