Graphics2D

10 respostas
Leco2

Boa Tarde Pessoal!

Eu estou com uma dúvida, tem como eu dar um repaint(); só em uma área específica?

Por exemplo, eu tenho uma tela pintado com o fundo preto. E no meio eu tenho uma outra imagem qualque que eu vou precisar ficar dando repaint nela (em um intervalo de segundos). Eu não queria dar repaint na tela inteira porque o processamento da máquina sobe muito, tem como eu dar repaint só na imagem do meio sem dar repaint no fundo tb?

Estou tentando ver a função clip, mas não sei se tem alguma coisa haver.

grato!!

10 Respostas

ViniGodoy

Que tal olhar no javadoc? Você até sabia o nome do método:
public void repaint(int x, int y, int width, int height)

Além disso, se é você que está desenhando o componente no paintComponent, então você também pode otimizar ainda mais o desenho para obedecer esse comando de repaint. Nesse caso, use o getClipRect() do Graphics para obter exatamente qual é a área de pintura.

Se você não utilizar, o java irá ignorar o que for pintado fora do ClipRect, o que já garante um bom aumento de performance.

Outro detalhe. Usar BufferedImages em java é extremamente rápido. Porém, para obter a máxima performance, você deve usar corretamente. Dê uma lida nesse artigo para mais informações: http://www.jhlabs.com/ip/managed_images.html

ViniGodoy

PS: Repintar uma imagem, nem que ela ocupe a tela inteira, num intervalo de segundo nem sequer faz cócegas na maioria dos processadores.

Se o intervalor for o de milisegundos, aí sim, comece a se preocupar.

Leco2

putz ViniGodoy muito obrigado por esclarecer, não testei ainda mas tenho certeza que já vai me ajudar bastante!
As vezes a gente fica tão bitolado com um problema que nem percebe essas coisas, já tinha lido o Javadoc e nem reparei nesse outro repaint

Grato!

Leco2

haha na verdade é em milisegundos, tenho q atualizar em tempo real na verdade!

ViniGodoy

Ainda assim, é bem tranquilo colocar na tela uma imagem a 30 fps (taxa da maioria das câmeras).
Só veja esse artigo que coloquei no final, e use um bom algorítmo de controle do seu loop.

Que tipo de aplicação você está fazendo? Um player de vídeo ou um jogo?

Leco2

putz cara na verdade eu estou desenhando batimentos cardíacos (ECG) na tela, eu recebo os dados e vou desenhando.

ViniGodoy

Saquei, e qual é a taxa de atualização do hardware?

Leco2

então a taxa com que os dados chegam pra mim é de 240Hz por segundo

ViniGodoy

Caraca… 240Hz é realmente uma taxa animal. :slight_smile:
Leia o artigo do JHLabs que postei ali, vai ser muito importante para você. É importante também dar uma lida nesse tutorial aqui do Ponto V:

Dá uma olhada nesse artigo também, pois você vai precisar:
http://www.pontov.com.br/site/index.php/java/48-java2d/124-desenho-direto-active-rendering

Se puder, também exiba seu programa em tela cheia, no modo full screen exclusivo:
http://fivedots.coe.psu.ac.th/~ad/jg/ch03/index.html

Também será importante criar imagens com a mesma qualidade gráfica que sua tela. Para isso, use o método:

GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration(); Image image = gc.createCompatibleImage(sourceImage.getWidth(),sourceImage.getHeight(),Transparency.BITMASK);

E só então desenhe sobre essa imagem.

E, a menos que vc esteja falando de uma aceleração, todo hert já é por segundo. xD

Abraços,

Vinícius

Leco2

hahah vlw cara pelas dicas!! Vou fazer bom uso delas.
Eu já tinha conseguido fazer essa aplicação, mas antes eu recebia dados de um aparelho só. Agora a exigência mudou e eu tenho que processar e plotar na tela os dados de 4 e se possível 8 aparelhos. Agora imagina ter q tratar todos esses dados chegando na porta serial e ainda por cima ter que pintar. O processamento da minha máquina sobre pra 100%. Tudo bem que essa máquina aqui não é lah grande coisa!

Mas muito obrigado mesmo pelas dicas de ouro!!

Criado 11 de maio de 2011
Ultima resposta 11 de mai. de 2011
Respostas 10
Participantes 2