Desenpenho no redesenho

11 respostas
tabocu

Boa tarde,

Numa aplicação que estou desenvolvendo o Drag&Drop esta extremamente pesado. Gostaria de saber se é possivel diminuir a resolução do redesenho.

Basicamente quando se faz um Drag&Drop voce tem um grafico em movimento e o que eu queria saber se é possivel “diminuir os FPS (frames por segundo)” desse movimento para ter um ganho no desempenho

11 Respostas

tabocu

Outra coisa,

eu utilizo o anti aliasing, que tambem me faz perder em desempenho. existe algoritimos intermediarios de suavização de desenho que pese menos ou só tenho essa opção?

E
  1. Você pode pôr um timer no seu redesenho, de forma que você, em vez de ficar redesenhando a cada mudança de posição do mouse, só redesenhar depois de 0,5 segundo (por exemplo).
  2. Você pode só redesenhar a ponta do mouse em vez de todas as linhas. Isso é como quando você arrasta uma janela e em vez de mostrar a janela inteira à medida que você a arrasta, só mostra o contorno.
tabocu

Isso me parece interessante, pelo que devo procurar?
Ou vc tem algum link/exemplo que eu possa olhar?

Marky.Vasconcelos

Voce pode guardar esse grafico em uma BufferedImage já desenhando com a otimização, e desenhar apenas esse BufferedImage no Graphics2D.

tabocu

Marky, desculpe minha falta de conhecimento mas como seria fazer isto?
Sabe de algum exemplo ou sobre o que devo ler?

ViniGodoy

Para seguir a dica do Mark:

  1. Crie uma BufferedImage do tamanho do seu gráfico. Por exemplo, digamos que seja 50x50:

BufferedImage imagem = GraphicsEnvironment .getLocalGraphicsEnvironment() .getDefaultScreenDevice() .getDefaultConfiguration() .createCompatibleImage(50, 50, Transparency.TRANSLUCENT);

  1. Obtenha o Graphics dessa imagem e desenhe sobre ele:
Graphics2D g2d = imagem.createGraphics();
desenharGrafico(g2d);
g2d.dispose();
  1. Agora, ao invés de redesenhar o gráfico o tempo todo, simplesmente desenhe a imagem já pronta:

public void paintComponent(Graphics g) { g.drawImage(imagem, x, y, null); }

Desenhar BufferedImages na tela é um processo acelerado por hardware, milhares de vezes mais rápido do que desenhar usando o Graphics2D diretamente. Além disso, você não precisará recalcular boa parte do anti-aliasing, pois isso já estará armazenado na imagem.

Marky.Vasconcelos

tabocu:
Marky, desculpe minha falta de conhecimento mas como seria fazer isto?
Sabe de algum exemplo ou sobre o que devo ler?

Exatamente o que o ViniGodoy postou.

tabocu

Nossa, muito bom!

Por exemplo, se eu desenhar uma linha, a parte que nao foi desenhada fica como transparencia?

ViniGodoy

Sim, é para isso que serve aquele último parâmetro.

Usar essa técnica é o que deixou o Particles tão veloz.

tabocu

Nossa viny, muito obrigado pela sua ajuda. Alias eu achei muito legal o Particles.

O codigo fonte dele é fechado?

ViniGodoy

Por hora é sim. Vou publicar uma série de artigos sobre ele no Ponto V! e então disponibilizar o código pra quem quiser ler.
É que sem um pouco de texto fica um pouquinho complicado entender pq fiz ali as coisas do jeito que fiz. :slight_smile:

Criado 3 de janeiro de 2011
Ultima resposta 4 de jan. de 2011
Respostas 11
Participantes 4