Wie implementiere ich Double Buffering

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
Hallo,

siehe Titel, habe mir das Sun-Tutorial dazu angesehen, muss aber gestehen dass ich damit nicht so viel
anfangen kann. Ich verstehe das Konzept von Double Buffering, aber ich weiss nich wie ich es umsetze.

Kann mir vllt jmd. einen 3-Zeiler schreiben, der mir folgendes:

Code:
@Override
protected void paintComponent(Graphics g){
        g.drawRect(xPos,yPos,objectWidth,objectHeight);
}
auf einem JPanel mit Double Buffering Technologie umsetzt? So dass wenn ich zB 100 mal in der Sekunde
die Position verändere und ein repaint() aufrufe, es nicht flackert?

Wär sehr nett, danke schön :toll:
 
Swing-Komponenten sind bereits gepuffert, DoubleBuffering ist nicht mehr nötig.
Man kann's sogar ein- und ausschalten.

Es gibt auch Threads im Forum, die das Thema behandeln.

100 mal in der Sekunde ist vielleicht unnötig, das menschliche Auge nimmt Bildwechsel bereits ab 25 Bildern/s als flüssige Bewegung wahr.
 
Achso das ist schon so, ok danke wusste ich nicht.

PS: Vllt gilt 25fps als "flüssig", aber zwischen 25 und >50-60 merkt man deutlich einen Unterschied in Spielen zB
 
Das ist was anderes herr gamer, weil du dich in den spielen meist selber bewegst und dadurch kommt deine bewegung ggf zu spät an. Normale Filme/Videoclips haben auch nur 25 oder 30 fps.
 
raiL hat gesagt.:

:?:

weil du dich in den spielen meist selber bewegst und dadurch kommt deine bewegung ggf zu spät an.
Das verstehe ich irgendwie nicht. In Filmen passiert ja z.T. auch sehr viel in einer Sekunde, aber dort sieht es mit 25 fps vollkommen flüssig aus. Was macht es jetzt für einen Unterschied wenn ich mich im Spiel bewege und nicht jeder Step gemalt wird? Ich meine in spielen bewegt man sich ja nicht schneller als eine Kamera in einem Film sich z.B. dreht.

Kapier das grad echt nicht ???:L
 
Nunja einerseits kommt es in gewissen spielen auf die Reaktionsgeschwindigkeit an, andererseits hast du in einem spiel nie konstante frameraten weil sich die Landschaft ändert und teilweise rechenintensiver / weniger rechenintensiver wird. Wenn es nur kurz unter 25 fps geht dann merkt man das.
 
Zudem orientiert sich in Spielen die Bewegung der Figur an der Framerate. Wenn Du eine hohe Framerate hast, sind die Bewegungs-Intervalle entsprechend feiner und die Bewegung scheint damit flüssiger, weil Schwankungen, wie von raiL angesprochen, nicht so auffallen.

<edit>
Was Du vermutlich meinst ist nicht Doppelpufferung, sondern aktives Rendern. Google mal z. B. nach "Killer Game Programming" da dürftest Du einige Hinweise finden.
</edit>
 
Sollte trotzdem bei Swing ein Flackern auftreten, egal bei welchem Container (JPanel JLabel, ect.) kann man dagegen dann noch irgendwas machen?
 
Was soll mir das sagen?

Oder kann bei swing eh nie was flackern?

Ich hab grad mal das hier gefunden:
Code:
g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
 
Zuletzt bearbeitet:
Und was soll MIR DAS jetzt sagen? 😉
Das bezog sich nur darauf, dass bei Swing "eigentlich" nichts Flackern kann, außer, wenn man explizit etwas programmiert, was Flackern verursacht...
Code:
while (true)
{
    toggleColor();
    repaint();
}
😉
 
Wenn es darum geht, die Leistungsfähigkeit einer Swing Komponente zu steigern, kann man entweder die "passive Maltechnik" oder die "intelligente Maltechnik" einsetzen (oder auch beide).
Bei der "passiven Maltechnik" wird nicht direkt auf die Komponente gemalt, sondern auf ein Image, das man dann in paintComponent mit einem einzigen drawImage auf die Graphics der Komponente überträgt.
Die "intelligente Maltechnik" versucht die Clip Informationen zu benutzen, um den Malbereich auf ein kleineres Rechteck zu beschränken (Graphics#getClipBounds), anstatt immer die gesamte Komponente zu malen. Dies setzt die Verwendung der "multi arguments" Version der "repaint" Methode voraus, welche das zu malende Rechteck definiert.
 
@hdi:

Vielleicht kennst du das ja bereits, aber hier im Forum gibt es ein super Tutorial zum Spiele Programmieren, das ich selber gerade am lesen bin.

Ab Seite 10 ist da etwas über Zeitmessung geschrieben und im folgenden wird erklärt, wie man die Bewegungen aktualisiert in Abhändigkeit der Zeitmessungen, so dass der Bildverlauf flüssig ist. (Ich kann es leider nicht erklären, da ich es selber noch nicht zu 100% verstehe).

Irgendwo steht glaube ich auch etwas über aktives Rendering.

2D-Spieleprogrammierung


Ich hoffe das hilt.

Mfg ica
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben