Java Programmieren repaint Flacker-Problem

...komplette Frage anzeigen

2 Antworten

Also was bei mir immer geholfen hat, war die Klasse BufferStrategy im Package java.awt.image. Die Klasse macht eigentlich nichts weiter, als das von Anderen bereits genannte Doublebuffering, oder noch besser Pageflipping zu implementieren. Zum einbinden in dein Projekt gibt es gute Youtube-Videos zu dem Thema.

Hoffe, dass ich dir helfen konnte, L0renz :)

Das Flackern kommt daher, dass du einen großen Zeichenbefehl hast und bei repaint() der Bildschirm üblicherweise komplett erneuert wird.

Meiner Meinung nach ist repaint() immer eine schlechte Idee.

besser ist es, zu aktualisierende Bereiche zu überzeichnen.

Wenn das ganze Bild überzeichnet werden soll ist es eine häufige Methode, ein Offscreenbild vom Bildschirm zu erstellen und dieses dann über den Bildschirm drüber zu zeichnen. Double buffering ftw.

ich habe mal ein Programm mit hüpfenden Bällchen geschrieben, welches zum test über mehrere verschiedene aktualisiermethoden verfügt. Double Buffering ist am ästhetischten aber auch am langsamsten.

SoloMid 11.01.2014, 17:14
public  void update (Graphics graphics) {

    if ( dbImage == null) {

        dbImage = createImage (this.getSize().width,this.getSize().height);
        dbg = dbImage.getGraphics();
    }

    dbg.setColor(getBackground());
    dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);

    dbg.setColor (getForeground());
    run (dbg);

    graphics.drawImage (dbImage, 0, 0, this);

}

Ja das habe ich schon versucht und das kam dabei raus ... nur weiß ich nicht so genau wie ich das nun in mein Programm implementieren soll ...

0
SoloMid 11.01.2014, 17:33
@PerfectMuffin

Hmm es hat sich was verändert aber es funktioniert immer noch nicht so ganz ...

kann ich dir mal den Quelltext schicken und könntest du da eventuell mal rübergucken ?

0
PerfectMuffin 11.01.2014, 18:14
@SoloMid

Vermutlich weil sowohl paint() als auch update() aktive Teile des Spiels überzeichnen.

Die Klasse Ball ist mir nicht bekannt.

0
PerfectMuffin 11.01.2014, 19:55
@SoloMid

Das Programm ist nur teilweise double buffered. in paint() wird außerhalb des Pufferbilds gezeichnet, ich glaube, das könnte die Ursache sein.

0
PerfectMuffin 11.01.2014, 20:46
@SoloMid

Besser wäre, wenn du es selbst gebacken kriegst

Wenn dein eigentliches Grafikobjekt nur noch zum zeichnen des Bildes verwendet wird, hast du Garantie auf perfektes db.

0
SoloMid 11.01.2014, 20:51
@PerfectMuffin

Ja ich weiß ja auch was rauskommen soll ... aber ich sitze jetzt ohne spaß nen ganzen Tag an dem Ding und komm nicht weiter, weil ich überhaupt kein plan hab wo ich ansetzen sollte ...

Und da ich ganz neu mit Oberflächenprogrammierung mit Java angefangen habe, weiß ich auch, dass ich das alleine nicht hinbekommen :(

0
PerfectMuffin 11.01.2014, 21:03
@SoloMid

Welcher Anteil des Projekts stammt von dir? (Exklusiv Internetkopien)

0
SoloMid 11.01.2014, 21:21
@PerfectMuffin

Ich habe ein Projekt auf Youtube versucht nachzumachen um das alles zu verstehen ... nur das beim ersten Versuch mich etwas an Java heranzuwagen schon Probleme auftreten hab ich nicht gedacht ...

0
PerfectMuffin 11.01.2014, 22:32
@SoloMid

NICHT kopieren. Und wenn, dann auf KEINEN FALL von YouTube.

Lern mit ordentlichen Quellen.

1

Was möchtest Du wissen?