Estou criando um jogo XNA que requer um espaço enorme para os jogadores. Atualmente, o mapa de altura de teste que estou usando é 4096x4096 e é salvo como um BMP de 4 bits.
O que estou tentando fazer é pegar esse enorme arquivo de altura e renderizá-lo no jogo. O problema que estou enfrentando é o fato de que é ineficiente carregar todo o terreno na memória de uma só vez, pois ele usará a maior parte da memória disponível.
Outro problema com o qual me deparei é que não consigo processar o terreno em um único primitivo por causa de um limite definido no XNA.
Com isso dito, deparei-me com várias soluções, todas listadas abaixo:
- Renderização com base na localização do usuário atual - basicamente desenhando um quadrado ao redor do usuário, independentemente da sua orientação no mundo. Isso também não é exatamente o que eu queria, porque você ainda está processando um espaço que o usuário não vê.
- Renderização com base na orientação e posição do usuário - Encontrei uma fórmula para recuperar um triângulo que deveria ter quais pixels do mapa de altura deveriam ser renderizados, mas isso se mostrou muito difícil.
- Dividir o terreno em vários pedaços e renderizar quais são os mais próximos do usuário - Ainda não é muito eficiente, pois você ainda está processando pedaços que as pessoas não verão. E é trabalhoso, pois preciso dividir meu mapa de altura em várias partes, e a escalabilidade se torna um grande problema.
Depois de tentar essas soluções, estou sem ideias para o que fazer. Recebi algumas respostas em que as pessoas estão me dizendo para fazer esses algoritmos complexos, mas simplesmente não tenho idéia de como abordá-los.
Então, basicamente, estou pedindo uma maneira simples e direta de renderizar terrenos enormes no XNA com a máxima eficiência.
Sou um pouco novo no desenvolvimento de jogos em geral, mas estou disposto a pesquisar se parecer promissor.
Atualização 1: Após pesquisar o método de geoclipmapping, comecei a codificar com isso. Eu tenho toda a matemática feita, e o jogo corre. No entanto, é extremamente ineficiente - o que provavelmente é uma má codificação da minha parte. Ele roda a 2FPS e usa um núcleo inteiro da minha CPU. Vou tentar melhorar o código, mas acho que vou precisar de mais ajuda, então aqui está um Pastebin do código da classe de gerenciador de terreno. Mais tarde, postarei mais resultados se conseguir que seja mais eficiente.