Desenpenho no redesenho

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

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?

  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.

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

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

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

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.

[quote=tabocu]Marky, desculpe minha falta de conhecimento mas como seria fazer isto?
Sabe de algum exemplo ou sobre o que devo ler?[/quote]

Exatamente o que o ViniGodoy postou.

Nossa, muito bom!

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

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

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

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

O codigo fonte dele é fechado?

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: