Java Applet - Double Buffering Problem (Flackern)

Status
Nicht offen für weitere Antworten.
Hallo zusammen,

naachdem ich zum Double Buffering schon Einiges gelesen habe und auch probiert habe, hier mein Problem:

Benutze ein Java Applet mit einem Image der Größe 640x480 bzw. noch ein wenig größer, da noch Click Areas dabei sind die je nachdem welche angeklickt wird im Applet etwas Bestimmtes anzeigen (jetzt noch eher Sinnloses, später hoffentlich schöne Graphiken). Das Applet ist noch um den Rand (2 Pixel) größer. Soweit so gut. Ich löse das Ganze mit einem Thread und benutze zwei Images und zwei Graphics zum "doppelten" Double Buffering (hab das mal so als Beispiel bekommen)

Also in etwa so:

[highlight=Java]
public void init ()
{


buffer1 = createImage(640, 500);
graph1 = buffer1.getGraphics();

buffer2 = createImage(640, 500);
graph2 = buffer2.getGraphics();

setBackground(Color.black);

[/highlight]

Thread:
[highlight=Java]
public void start()
{

if(t == null)
{

t = new Thread(this);
threadAussetzen = false;
t.start();
}
else
{

if(threadAussetzen)
{

threadAussetzen = false;

synchronized(this)
{
notify();
}
}
}
}

[/highlight]

Im Stop wird threadAussetzen = true gesetzt.

Im run des Threads wird dann neben Synchronisierung Folgendes gemacht:

[highlight=Java]

Graphics g;

if(schalter == 0)
{
g = backg2;
}

else
{
g = backg1;
} // end else

g.setColor(getBackground());
g.fillRect(0,0,640,500);
g.setColor(Color.white);


if (!clickedArea1 && !clickedArea2)
{
g.drawString("bla bla!", 160,240);
}

else
{
if (clickedArea1)
{
g.drawString("bla bla 1!", 160,240);
}

else
{
g.drawString("bla bla 2!", 160,240);
}
}

g.drawLine(x1,y1,x2,y2);

// Ein paar mehr Linien werden noch gezeichnet

schalter ^= 1;
repaint();

[/highlight]

update und paint sehen so aus:

[highlight=Java]
public void update(Graphics g)
{

if(schalter == 0)
{
g.drawImage(buffer1, 2, 2, this);
}

else
{
g.drawImage(buffer2, 2, 2, this);
}
}

public void paint(Graphics g)
{
//
// Update the window.
//
update(g);
}

[/highlight]

Jetzt meine Fragen (ok, dass ich kein Java Guru bin, hat man sicher am Code gemerkt):

Wieso flackert das immer noch?
Was kann man dagegen machen?
Gibts Probleme beim Buffering?
Ist das Image einfach zu groß?

Ok, war wirklich lange. Danke schon mal im Voraus fürs Feedback.

LG

EH
 

André Uhres

Top Contributor
nachdem ich zum Double Buffering schon Einiges gelesen habe und auch probiert habe, hier mein Problem:
Warum nimmst du nicht einfach Swing? Eine der bemerkenswertesten Eigenschaften von Swing ist, daß es die Unterstützung für Doppelpufferung direkt ins Toolkit einbaut. Beispiel:
Code:
import java.awt.*;
import javax.swing.*;

public class AppletTest extends JApplet {

    private boolean clickedArea1;
    private boolean clickedArea2;
    private int x1 = 50,  y1 = 50,  x2 = 200,  y2 = 200;

    /** Initializes the applet AppletTest */
    @Override
    public void init() {
        try {
            EventQueue.invokeAndWait(new Runnable() {

                public void run() {
                    add(new Graphic());
                }
            });
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    class Graphic extends JComponent {

        public Graphic() {
            setBackground(Color.black);
        }

        @Override
        protected void paintComponent(final Graphics g) {
            super.paintComponent(g);
            g.setColor(getBackground());
            g.fillRect(0, 0, 640, 500);
            g.setColor(Color.white);
            if (!clickedArea1 && !clickedArea2) {
                g.drawString("bla bla!", 160, 240);
            } else {
                if (clickedArea1) {
                    g.drawString("bla bla 1!", 160, 240);
                } else {
                    g.drawString("bla bla 2!", 160, 240);
                }
            }
            g.drawLine(x1, y1, x2, y2);
        // Ein paar mehr Linien werden noch gezeichnet
        }
    }
}
 
Danke mal für die Antwort. Von Swing habe ich schon mal was gehört, aber noch nie was damit gemacht. Ich kann's ja mal ausprobieren.

Mich würde trotzdem interessieren, warum meine Implementierung flackert, einfach, um es zu verstehen und etwas dazuzulernen.

EDIT: Wenn ich das Applet im Browser laufen lasse, ist die CPU fast völlig ausgelastet. Hmm, ist ja auch nicht gerade im Sinne des Erfinders
 
Zuletzt bearbeitet:
Im Code, den du uns gezeigt hast, ist alles statisch. Es kann nichts flackern. Am besten machst du ein kurzes, selbständiges und kompilierbares Beispiel. Wenn du willst, kannst du auch mit folgendem Beispiel vergleichen: AwtDoubleBuffered - Byte-Welt Wiki

Hmmm, wenn ich keinen Text verwende, sondern nur irgendwelche Muster zeichne - also Graphic Area Pixel für Pixel aufbaue bzw. ein paar Flächen anmale - dann flackert es nicht. Woran kann das liegen?
 

L-ectron-X

Gesperrter Benutzer
Es kann schon flackern. Das Konzept stimmt nicht.
Der Aufruf von update() gehört nicht in die paint()-Methode.

Beim DoubleBuffering wird, so wie ich es kenne, die Hauptarbeit in der update()-Methode gemacht, die von Hause aus leer ist und mit sinnvollem Code gefüllt werden muss.

Hier mal ein Beispiel, wie man es besser machen kann.
Zumindest ist der Code für das DoubleBuffering OK.
http://www.java-forum.org/deployment/28009-mouseentered-mit-einem-bild-im-applet.html#post179043
 

André Uhres

Top Contributor
Beim DoubleBuffering wird, so wie ich es kenne, die Hauptarbeit in der update()-Methode gemacht, die von Hause aus leer ist und mit sinnvollem Code gefüllt werden muss.
AWT ruft für heavyweight Komponenten bei einem systemausgelöster Malvorgang die update Methode nicht auf. Daher gehört die Hauptarbeit wohl eher in die paint Methode.

Wenn die Komponente nicht update() überschreibt, löscht die Default-Implementierung von update() den Hintergrund der Komponente (wenn es nicht eine lightweight Komponente ist) und ruft einfach paint() auf.

Während es zutreffend ist, daß die Default-Implementierung von update() die paint() aufruft, ermöglicht dieser "Updatehaken" einem Programm, den anwendungsausgelösten Malvorgang anders anzufassen, wenn es gewünscht wird. Ein Programm muß annehmen, daß ein Aufruf von paint() andeutet, daß der Bereich, der durch das Cliprechteck vom Graphics definiert wird, "beschädigt" ist und vollständig neu gezeichnet werden muß, gleichwohl ein Aufruf von update() dieses nicht andeutet, was einem Programm ermöglicht, zusätzliches Zeichnen zu tun.

Zusätzliches Zeichnen* ("incremental painting") ist nützlich, wenn ein Programm die zusätzliche Darstellung über die vorhandenen Teilstücke dieser Komponente überlagern möchte. Dadurch kann auch ein Flackern verhindert werden. Siehe auch: Malen in AWT und Swing - Byte-Welt Wiki

Das Konzept der Doppelpufferung ist aber noch ein anderes. Die Idee dahinter ist, dass wir zuerst alles auf ein off-screen Image malen, und, wenn's fertig ist, das off-screen Image mit einem einzigen drawImage auf die on-screen Graphics kopieren.

*ANMERKUNG: beachte bitte, daß die zusätzliche Zeichnentechnik (incremental painting) nicht für lightweight Komponenten verwendet werden sollte.
 
Zuletzt bearbeitet von einem Moderator:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Applet Java Applet läuft im Browser nicht mehr (HTTPClient - NoClassDefFoundError) Tools - Maven, Gradle, Ant & mehr 3
T Daten per POST-Methode aus Java-Applet nach php-Script senden Tools - Maven, Gradle, Ant & mehr 3
S Applet Applet mit C# öffnen: java.lang.SecurityException: Permission denied (WinXP) Tools - Maven, Gradle, Ant & mehr 8
E Java Applet bearbeiten Tools - Maven, Gradle, Ant & mehr 8
H Java Applet Problem beim einbinden in HTML Tools - Maven, Gradle, Ant & mehr 3
L PHP + Java Applet Kommunikation Tools - Maven, Gradle, Ant & mehr 9
G Java-Applet Probleme beim Browser Tools - Maven, Gradle, Ant & mehr 14
A Java-Applet Sandbox deaktiviren? Tools - Maven, Gradle, Ant & mehr 2
B Java-Applet geht nicht (auf dem Webserver) Tools - Maven, Gradle, Ant & mehr 9
S Java Applet per Klick starten? Tools - Maven, Gradle, Ant & mehr 6
M Java Applet - enforce use of older JRE Tools - Maven, Gradle, Ant & mehr 3
N Wie Java-Programm zu Applet machen?! Tools - Maven, Gradle, Ant & mehr 2
V applet Java 1.6 -> 1.5 Problem ... wie mit Ant zu lösen? Tools - Maven, Gradle, Ant & mehr 7
S Java-Applet Steuerung IO Karte am Drucker-Port Tools - Maven, Gradle, Ant & mehr 4
T Applet soll Java Programm starten Tools - Maven, Gradle, Ant & mehr 2
P Java-Applet funktioniert unter WINXP nicht Tools - Maven, Gradle, Ant & mehr 2
N Java 1.6 Applet auf älteren Versionen ausführbar? Tools - Maven, Gradle, Ant & mehr 4
J Java Applet bei mouseover mit Tooltip Tools - Maven, Gradle, Ant & mehr 3
B Java-Applet startet nicht aus dem Browser Tools - Maven, Gradle, Ant & mehr 1
K Java-Applet Uhrzeit Tools - Maven, Gradle, Ant & mehr 2
A RSS-Feeds auslesen mit JAVA speichern und Applet übergeben Tools - Maven, Gradle, Ant & mehr 2
W Java-Applet Funzt ned! Tools - Maven, Gradle, Ant & mehr 3
B Java Applet im Systemtray Tools - Maven, Gradle, Ant & mehr 2
H Java 1.4 Applet, IE 6 und Java 6 funktioniert nicht zusammen Tools - Maven, Gradle, Ant & mehr 2
B Jukebox mit Java [Html Applet] Tools - Maven, Gradle, Ant & mehr 11
A Hilfe! Java Applet Lake von Anfy - wie in HP einbinden? Tools - Maven, Gradle, Ant & mehr 25
G rotierende Bilder im Java Applet Tools - Maven, Gradle, Ant & mehr 3
M Browser Fehler bei Applet: java.security.AccessControl. Tools - Maven, Gradle, Ant & mehr 6
G Java Applet Anfängerfrage Tools - Maven, Gradle, Ant & mehr 3
H Java Applet bei jedem booten starten Tools - Maven, Gradle, Ant & mehr 2
G wie java applet abändern? Tools - Maven, Gradle, Ant & mehr 2
G Externes .jar in Java Applet einbinden Tools - Maven, Gradle, Ant & mehr 2
A java applet zertifikat Tools - Maven, Gradle, Ant & mehr 4
G Java Applet neu laden Tools - Maven, Gradle, Ant & mehr 3
A java-applet thread Tools - Maven, Gradle, Ant & mehr 3
H Java Applet deutsche Tastatur Tools - Maven, Gradle, Ant & mehr 5
F Fenstergrößen in java applet festlegen Tools - Maven, Gradle, Ant & mehr 4
R Java Applet zum Auslesen der Größe des Arbeitsspeicher Tools - Maven, Gradle, Ant & mehr 2
G Applet mit der Java Mail-API Tools - Maven, Gradle, Ant & mehr 9
S JAVA APPLET While Schleife Frage! Tools - Maven, Gradle, Ant & mehr 3
S Netbeans Java Applet Tools - Maven, Gradle, Ant & mehr 3
S Java Applet funktioniert nicht! Tools - Maven, Gradle, Ant & mehr 2
D Größe eines jpeg's in einem Java-Applet ändern ? Tools - Maven, Gradle, Ant & mehr 7
M Java applet fehler Tools - Maven, Gradle, Ant & mehr 2
Y Einfaches Java-Applet Tools - Maven, Gradle, Ant & mehr 13
G Java applet nur einmal starten Tools - Maven, Gradle, Ant & mehr 2
J Memberbereich in einem Java Applet ? Tools - Maven, Gradle, Ant & mehr 5
G Aus Java Anwendung wird Applet Tools - Maven, Gradle, Ant & mehr 3
T Java Applet - Problem mit Tastatur Abfrage Tools - Maven, Gradle, Ant & mehr 5
G Daten zwischen PHP und Java-Applet austauschen? Tools - Maven, Gradle, Ant & mehr 3
N Selsame Ladeprobleme bei Java Applet Tools - Maven, Gradle, Ant & mehr 6
G NullPointer Exception in Java-Applet, aber nur online! Tools - Maven, Gradle, Ant & mehr 13
N Java Applet mit einer GUI erstellen Tools - Maven, Gradle, Ant & mehr 5
C Größe Java-Applet während der Laufzeit ändern Tools - Maven, Gradle, Ant & mehr 5
K Java Applet mit Lauftext, kleiner Fehler? Tools - Maven, Gradle, Ant & mehr 6
M Java-Applet Unterstützung in Browsern (für Java 1.1.8) Tools - Maven, Gradle, Ant & mehr 5
G Java Applet Kugelstapel Tools - Maven, Gradle, Ant & mehr 2
C java applet kann auf jar nicht zugreiffen Tools - Maven, Gradle, Ant & mehr 16
A Java applet in html anzgeigen - ClassNotFoundException Tools - Maven, Gradle, Ant & mehr 10
M Java Applet um Serielle Schnittstelle anzusprechen Tools - Maven, Gradle, Ant & mehr 3
R Java Applet offline nutzen! Tools - Maven, Gradle, Ant & mehr 5
R Freeware Java-Applet verändern? Tools - Maven, Gradle, Ant & mehr 41
P Colors in Java Applet ? Tools - Maven, Gradle, Ant & mehr 2
G Hilfe! Java Applet Tools - Maven, Gradle, Ant & mehr 6
T Java Applet Rechte zum Datei schreiben geben Tools - Maven, Gradle, Ant & mehr 3
G Analog Uhr - Java Applet Tools - Maven, Gradle, Ant & mehr 2
X Java Sonnensystem Applet Tools - Maven, Gradle, Ant & mehr 10
R access denied beim Java Applet Tools - Maven, Gradle, Ant & mehr 5
Ä Klassenpfade bei Java-Applet Tools - Maven, Gradle, Ant & mehr 3
G Java-Applet . zwinkernder Smily! Tools - Maven, Gradle, Ant & mehr 3
G Java Applet - Online Experiment - Teilnehmer gesucht Tools - Maven, Gradle, Ant & mehr 11
T Java - Applet startet nicht in Firefox und Mozilla Tools - Maven, Gradle, Ant & mehr 13
F Java applet Primzahlen Tools - Maven, Gradle, Ant & mehr 3
R Java Applet Bildbetrachter Tools - Maven, Gradle, Ant & mehr 2
D Java Applet mit MySql- Anbindung Tools - Maven, Gradle, Ant & mehr 2
M Von Java-Application zum Java-Applet Tools - Maven, Gradle, Ant & mehr 5
S Java-Applet "Navigations-Menü" Tools - Maven, Gradle, Ant & mehr 2
D Web-Anwendung mit JSP,Applet oder Java-Anwendung Tools - Maven, Gradle, Ant & mehr 4
S Java-Applet wird nicht erneuert Tools - Maven, Gradle, Ant & mehr 2
O Java-Applet, Kompilieren, MS IE Tools - Maven, Gradle, Ant & mehr 2
C Java-Applet auf Webserver übertragen und starten Tools - Maven, Gradle, Ant & mehr 4
M JAVA IRC APPLET Tools - Maven, Gradle, Ant & mehr 2
A Java Applet läuft nicht, wenn via IIS geladen Tools - Maven, Gradle, Ant & mehr 2
G Wegschaffen von "Java Applet Window" Meldung Tools - Maven, Gradle, Ant & mehr 5
D Java-Applet einbinden Tools - Maven, Gradle, Ant & mehr 5
R Datei in Java-Applet einlesen Tools - Maven, Gradle, Ant & mehr 10
H Maven NetBeans Java Application ohne Manifest-Datei Tools - Maven, Gradle, Ant & mehr 7
B Kleines Werkzeug zum Anzeigen von Mehrfachvererbung mit Interfaces in Java Tools - Maven, Gradle, Ant & mehr 5
D Java Programm veröffentlichen am Besten modular Tools - Maven, Gradle, Ant & mehr 28
H Maven Verbindung Java Projekt und Jenkins Build job Tools - Maven, Gradle, Ant & mehr 21
Q Java Eclipse Fehlermeldung bei Installation Tools - Maven, Gradle, Ant & mehr 3
D Maven Abhängigkeiten überprüfen auf Kompatibilität mit einer anderen Java-Version Tools - Maven, Gradle, Ant & mehr 11
R Webstart Java 11 ohne Web Start Tools - Maven, Gradle, Ant & mehr 5
M Java mit Modulen kompilieren klappt nicht Tools - Maven, Gradle, Ant & mehr 9
R Java mitnehmen Tools - Maven, Gradle, Ant & mehr 14
W Java on Cloud - which Provider Tools - Maven, Gradle, Ant & mehr 0
S Python-Code mit Java ausführen Tools - Maven, Gradle, Ant & mehr 13
B Java auf Smartcards?! Tools - Maven, Gradle, Ant & mehr 9
J Java App im Mac Store veröffentlichen Tools - Maven, Gradle, Ant & mehr 0
M Maven (Java EE, WAR) Eigener Buildschritt - Manipulation von Dateien Tools - Maven, Gradle, Ant & mehr 4

Ähnliche Java Themen

Neue Themen


Oben