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
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