Pregunta

Estoy desarrollando un juego para la web. El mapa de este juego tendrá un mínimo de 2000 km por 2000 km. Quiero poder codificar la elevación y el tipo de terreno en algún nivel de granularidad, por ejemplo, 100m X 100m.

Para un mapa de 2000 km por 2000 km que almacena esta información en cubos 2 de 100 m, significaría 20000 por 20000 elementos o un total de 400,000,000 registros en una base de datos.

¿Hay alguna otra forma de almacenar este tipo de información?

MÁS INFORMACIÓN

El mapa en sí nunca se mostrará en su totalidad. Las unidades se moverán en el mapa por turnos y los jugadores recibirán comentarios sobre dónde se encuentran y cómo se ve el área local. El terreno dictará la velocidad y la prohibición de movimiento.

Supongo que estoy tratando de decir que el mapa se usará para el juego y no necesariamente para fines gráficos o de visualización.

¿Fue útil?

Solución

Lo trataría de manera diferente, separando el tipo de terreno y la elevación.

  1. El tipo de terreno, supongo, no cambia tan rápido como la elevación, probablemente hay sectores del mismo tipo de terreno que se extienden por mucho más tiempo que el nivel más bajo de granularidad. Mapearía esos sectores en registros de bases de datos o algún tipo de tabla hash, dependiendo del rendimiento, la memoria y otros requisitos.

  2. La elevación supongo que es semi-contigua, ya que cambia gradualmente en su mayor parte. Intentaría mapear los valores en un conjunto de funciones continuas (diferentes conjuntos entre partes que no continúan, como en un cambio repentino en la elevación). Para cualquier conjunto de coordenadas para el que el terreno tenga la misma elevación o pueda describirse mediante una función simple, solo necesita definir el rango que cubre esta función. Esto debería reducir la cantidad de información que necesita registrar para describir la elevación en cada punto del terreno.

Así que básicamente dividiría el mapa en diferentes sectores que componen rangos (x, y), una vez para el tipo de terreno y otra para la elevación del terreno, y construiría una tabla hash para cada uno que pueda devolver el valor apropiado según sea necesario.

Otros consejos

Depende de cómo quieras generar tu terreno. Por ejemplo, podría generarlo todo de manera procesal (utilizando la interpolación de un mapa de terreno / altura de baja resolución, almacenado como dos '' mapas de bits '', con interpolación aleatoria sembrada de las coordenadas xy para garantizar que el terreno no se transforma), y usar un mínimo almacenamiento. Si desea áreas de terreno que estén completamente definidas, puede almacenarlas por separado y usarlas cuando sea apropiado, generando el resto al azar.

Si desea un terreno completamente definido, entonces necesitará buscar algún tipo de técnica de compresión / transmisión para extraer solo el terreno que le interesa actualmente.

Si desea el tipo de granularidad que está buscando, entonces no hay una forma obvia de hacerlo.

Podría intentar una transformación wavelet bidimensional, pero eso es bastante complejo. Algo así como una transformación de Fourier funcionaría bastante bien. Además, probablemente no almacenarías el terreno con un camino de un registro por trozo de tierra; tiene más sentido tener algún tipo de campo de base de datos que pueda almacenar una matriz codificada.

Creo que la solución habitual es dividir su dominio en "mosaicos". de tamaños manejables. Tendrá que agregar un poco de lógica para cargar los mosaicos apropiados en cualquier momento, pero no está mal.

No debería necesitar acceder a toda esa información a la vez, incluso si cada cubo de 100m2 ocupara un solo píxel en la pantalla, ninguna pantalla que conozco podría mostrar 20k x 20k píxeles a la vez.

Además, no usaría una base de datos - mira en el mapeo de altura - usando efectivamente un black & amp; imagen blanca cuyos valores de píxeles representan alturas.

¡Buena suerte!

Esa será una gran cantidad de información, sin importar la forma en que la mire. 400,000,000 celdas de cuadrícula cobrarán su peaje.

Veo dos formas de evitar esto. En primer lugar, dado que es un juego basado en la web, es posible que pueda obtener un servidor con un HDD de tamaño decente y almacenar los registros de 400M como lo haría normalmente. O, más probablemente, cree algún tipo de mecanismo de almacenamiento propio para mayor eficiencia. Entonces solo tendría que idear una forma de acceder a los datos de manera eficiente, lo que podría hacerse teniendo en cuenta el hecho de que dudosamente necesitará usarlos todos a la vez. ;)

La otra forma sería algún tipo de compresión. Sin embargo, debes tener cuidado con esto. La mayoría de los algoritmos de compresión listos para usar no le permitirán descomprimir una ubicación arbitraria en la transmisión. ¿Quizás sus datos de terreno tienen algunos patrones que puede usar? Dudo que sea completamente al azar. Lo más probable es que prediga grandes áreas con los mismos datos. ¿Quizás esos pueden codificarse como tales?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top