Estoy creando un juego XNA que requiere un gran espacio para los jugadores. Actualmente, el mapa de altura de prueba que estoy usando es 4096x4096, y se guarda como un BMP de 4 bits.
Lo que intento hacer es tomar ese enorme archivo de mapa de altura y representarlo en el juego. El problema con el que me encuentro es el hecho de que es ineficiente cargar todo el terreno en la memoria de una vez, ya que utilizará la mayoría de la memoria disponible.
Otro problema con el que me he encontrado es que no puedo representar todo el terreno en una sola primitiva debido a un límite rígido establecido dentro de XNA.
Dicho esto, he encontrado una serie de soluciones, todas las cuales he enumerado a continuación:
- Representación basada en la ubicación del usuario actual, básicamente dibujando un cuadrado alrededor del usuario sin importar su orientación dentro del mundo. Esto tampoco es exactamente lo que quería, porque todavía está generando espacio que el usuario no ve.
- Representación basada en la orientación y posición del usuario: encontré una fórmula para recuperar un triángulo que se supone que tiene los píxeles del mapa de altura que se deben representar, pero esto resultó ser muy difícil.
- Dividir el terreno en varios fragmentos y representar cuáles están más cerca del usuario: aún no es muy eficiente, ya que aún está creando fragmentos que la gente no verá. Y requiere mucho trabajo porque luego tengo que dividir mi mapa de altura en varias partes, y la escalabilidad se convierte en un gran problema.
Después de probar esas soluciones, no tengo ideas sobre qué hacer. He recibido algunas respuestas donde la gente me dice que haga estos algoritmos complejos, pero simplemente no tengo ni idea de cómo abordarlos.
Básicamente, estoy pidiendo una forma simple y directa de renderizar terrenos enormes en XNA con la máxima eficiencia.
Soy bastante nuevo en el desarrollo de juegos en general, pero estoy dispuesto a investigar si parece prometedor.
Actualización 1: Después de investigar el método de geoclipmapping, comencé a codificar con eso. Tengo todas las matemáticas hechas, y el juego se ejecuta. Sin embargo, es extremadamente ineficiente, lo que probablemente sea una mala codificación de mi parte. Se ejecuta a 2FPS y utiliza un núcleo completo de mi CPU. Voy a intentar mejorar el código, pero creo que necesitaré más ayuda, así que aquí hay un Pastebin del código para la clase de administrador de Terrain. Volveré a publicar con más resultados más adelante si alguna vez consigo que sea más eficiente.