Pergunta

Eu estou trabalhando em um jogo de deslocamento 2D para iPhone. Eu tenho um grande fundo da imagem, digamos 480 × 6000 pixels, de apenas uma parte é visível (exatamente equivalente a um ecrã, 480 × 320 pixels). Qual é a melhor maneira de obter um tal fundo no ecrã?

Atualmente tenho a divisão fundo em várias texturas (para contornar o limite de tamanho máximo de textura) e desenhar todo o fundo em cada quadro como uma tira triângulo texturizado. O deslocamento é realizado por traduzir a matriz de modelagem. A caixa de tesoura está definido para o tamanho da janela, 480 × 320 pixels. Isto não é para ser rápido, eu só queria um código de trabalho antes de eu chegar à optimização.

Eu pensei que talvez a implementação OpenGL seria inteligente o suficiente para descartar a parte invisível do fundo, mas de acordo com um código de medição que escrevi parece que fundo leva 7 ms para desenhar, em média, e 84 ms no máximo. (Isto é medido no simulador.) Isto é cerca de metade do ciclo inteiro render, isto é. muito lento para mim.

Desenhar o fundo deve ser tão fácil como copiar cerca de 480 × 320 pixels de uma parte da VRAM para outro, ou, em outras palavras, super rápido. Qual é a melhor maneira de se aproximar de tal desempenho?

Foi útil?

Solução

Essa é a maneira mais rápida de fazê-lo. Coisas que você pode fazer para melhorar o desempenho:

  • Tente diferentes textura-formatos. Presumivelmente, os docs SDK tem detalhes sobre o formato preferido, e, presumivelmente, menor é melhor.
  • Cull fora inteiramente fora da tela telhas-se
  • dividir a imagem em texturas menores

Eu estou supondo que você está desenhando em um 1: zoom de nível 1; é esse o caso?

Editar: Opa. Depois de ler a sua pergunta com mais cuidado, eu tenho a oferecer outro conselho:. Timings feitas no simulador são inúteis

Outras dicas

A solução rápida:

  • Criar uma matriz de geometria de telhas (quadriláteros de preferência), de modo que existe pelo menos uma linha / coluna de ladrilhos fora da tela em todos os lados da área visível.

  • Mapa texturas para todos aqueles azulejos.

  • Assim que uma peça é fora da área visível pode liberar essa textura e ligam um novo.

  • Mover as telhas usando um modulo da largura telha e altura telha como a posição (de modo que a peça vai reposicionar-se em suas pos começando quando se mudaram exatamente uma telha de comprimento). Lembre-se também para remapear as texturas durante essa operação. Isso permite que você tenha uma pequena grade de muito pouca memória / textura carregado a qualquer momento. Que eu acho que é especialmente importante em GL ES.

Se você tem memória de sobra e ainda sofrem com velocidade de carregamento lento (embora você não deve para que a quantidade de texturas). Você poderia construir um motor de streaming de textura que pré-carrega texturas na memória mais rápida (o que quer que podem estar em seu dispositivo de destino) quando você chegar a uma nova área. Mapeamento como texturas será, nesse caso, ir de que a memória mais rápido quando necessário. Apenas certifique-se que você é capaz de pré-carregar-lo sem usar toda a memória e lembre-se para liberá-lo dinamicamente quando não for necessário.

Aqui está um link para um motor de telha GL (não ES). Eu não usei-me para que eu não posso garantir sua funcionalidade, mas pode ser capaz de ajudá-lo: http://www.mesa3d.org/brianp/TR.html

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