Pergunta

Eu estou no processo de escrever um jogo Java 2D. Eu estou usando as bibliotecas built-in Java 2D desenho, com base em uma compra Graphics2D I a partir de um BufferStrategy de uma tela em um JFrame (que às vezes é full-filtrada). O BufferStrategy é duplo tamponada. Repintura é feito ativamente, através de um temporizador. Eu estou tendo alguns problemas de desempenho, porém, especialmente no Linux.

E Java2D tem assim que muitas maneiras de criar buffers gráficos e desenhar gráficos que eu só não sei se estou fazendo a coisa certa. Eu tenho experimentado com graphics2d.getDeviceConfiguration (). CreateCompatibleVolatileImage, que parece promissor, mas eu não tenho nenhuma prova real que ele vai ser mais rápido se eu mudar o código de desenho para isso.

Na sua experiência, qual é a maneira mais rápida para renderizar gráficos 2D na tela em Java 1.5+? Note-se que o jogo é muito longe, então eu não quero mudar para um método completamente diferente de desenhar, como OpenGL ou um motor de jogo. Basicamente, eu quero saber como obter a maneira mais rápida de usar um objeto Graphics2D para desenhar coisas na tela.

Foi útil?

Solução

Eu estou tendo os mesmos problemas como você é, eu acho. Confira o meu post aqui:

Java2D Problemas de desempenho

Ela mostra a razão para a degradação do desempenho e como corrigi-lo. Não é garantido que funcione bem em todas as plataformas embora. Você verá porque no post.

Outras dicas

Uma síntese das respostas a este post, as respostas para de Consty, e minha própria pesquisa:

O que funciona:

  • Use GraphicsConfiguration.createCompatibleImage para criar imagens compatíveis com o que você está aproveitando. Isto é absolutamente essencial!
  • Use buffer duplo desenho via Canvas.createBufferStrategy.
  • Use -Dsun.java2d.opengl=True se disponível para acelerar o desenho.
  • Evite o uso de transformações para o dimensionamento. Em vez disso, o cache escalado versões das imagens que você vai usar.
  • imagens translúcidas Evite! imagens Bitmasked são bons, mas a translucidez é muito caro em Java2D.

Em meus testes, usando esses métodos, eu tenho um aumento de velocidade de 10x - 15x, fazendo adequadas gráficos Java 2D uma possibilidade

.

Aqui estão algumas dicas em cima da minha cabeça. Se você fosse mais específico e que você estava tentando fazer eu posso ser capaz de ajudar mais. Soa como um jogo, mas eu não quero assumir.

Apenas desenhar o que você precisa! Não cegamente chamar repaint () o tempo todo, experimentar alguns dos irmãos como repaint (Rect) ou repaint (x, y, w, h).

Tenha muito cuidado com mistura alfa, pois ele pode ser uma operação cara para misturar imagens / primitivas.

Tente prerender / cache, tanto quanto possível. Se você está desenhando um círculo da mesma forma, mais e mais, considere desenho em em um BufferedImage e depois é só chamar a BufferedImage. Você está sacrificando memória para a velocidade (típico de jogos / alta perf gráficos)

Considere o uso de OpenGL, o uso JOGL de LWJGL. JOGL é mais Java-like enquanto LWJGL oferece mais funcionalidades de jogo em cima de acesso OpenGL. OpenGL pode desenhar ordens de magnitude (com hardware adequado e motoristas) do balanço pode.

Há uma questão importante que não tenha sido mencionado ainda, eu penso: imagens de cache de tudo o que puder. Se você tem um objeto que se move pela tela, e sua aparência não muda muito, desenhá-la a uma imagem e, em seguida, processar a imagem para a tela em uma nova posição cada quadro. Faça isso mesmo se o objeto é muito simples - você pode ser surpreendido com quanto tempo você salvar. Processamento de um bitmap é muito mais rápido do que renderizar primitivos.

Você também pode querer olhar para a criação dicas renderização explicitamente, e desligar coisas como antialiasing se as considerações de qualidade permitir.

Já fiz alguns aplicativos básicos de desenho usando Java. Eu não tenho trabalhado em qualquer coisa demasiado gráfico-intensivo, mas eu recomendo que você tem um bom controle sobre todos os invocações 'repintar'. Uma chamada repaint extra em um recipiente pai poderia dobrar a quantidade de prestar o seu fazer.

Eu estive assistindo a esta pergunta, esperando que alguém iria oferecer-lhe uma resposta melhor do que a minha.

Entretanto, eu encontrei o seguinte white paper Sun , que foi escrito depois de uma versão beta do JDK 1.4. Há algumas recomendações interessantes aqui no ajuste fino, incluindo as bandeiras de tempo de execução (na parte inferior do artigo):

" Flag Runtime Para Solaris e Linux

A partir da versão Beta 3 do SDK, versão 1.4, Java 2D armazena imagens em pixmaps por padrão quando DGA não está disponível, se você estiver trabalhando em um ambiente de exibição local ou remoto. Você pode substituir esse comportamento com a bandeira pmoffscreen:

-Dsun.java2d.pmoffscreen = true / false

Se você definir esse sinalizador para true, fora da tela suporte pixmap é habilitado mesmo se DGA está disponível. Se você definir esse sinalizador como falso, fora da tela suporte pixmap está desativado. Desativar offscreen suporte pixmap pode resolver alguns problemas de renderização. "

certifique-se de usar o buffer duplo, desenhar primeiro para um grande buffer na memória que você, em seguida, lave a tela quando todo o desenho é feito.

Existem algumas coisas que você terá que manter em mente

1) é refrescante mostra essa ligação como usar swingtimers que pode ser uma boa opção para chamar repaint. Obtendo repaint descobri (como os cartazes anteriores disseram é importante para que você não está fazendo muito trabalho).

2) Certifique-se de que você está apenas fazendo desenho em uma thread. Atualizando UI de tópicos mulitple pode levar a coisas desagradáveis.

3) buffer duplo. Isso torna o mais suave de renderização. neste site tem mais algumas boas informações para você

Uma alternativa se você não quer ir puro Java 2D é usar uma biblioteca de jogos tais como GTGE ou JGame (procurá-los no Google), em seguida, oferecer fácil acesso a gráficos e também oferecem double buffering e de desenho muito mais simples comandos.

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