Ist es möglich, aktiven Rendering in Java Swing auszuführen, ohne auf dem EDT zu sein?
-
21-09-2019 - |
Frage
Ich bin auf der Suche in mit Buffer-Strategie und die folgende Technik auf dem Javadoc beschrieben:
// Main loop
while (!done) {
// Prepare for rendering the next frame
// ...
// Render single frame
do {
// The following loop ensures that the contents of the drawing buffer
// are consistent in case the underlying surface was recreated
do {
// Get a new graphics context every time through the loop
// to make sure the strategy is validated
Graphics graphics = strategy.getDrawGraphics();
// Render to graphics
// ...
// Dispose the graphics
graphics.dispose();
// Repeat the rendering if the drawing buffer contents
// were restored
} while (strategy.contentsRestored());
// Display the buffer
strategy.show();
// Repeat the rendering if the drawing buffer was lost
} while (strategy.contentsLost());
}
Es wäre toll, EDT und invokeLater
oder invokeAndWait
zu vermeiden, wenn eine Animation durchführen.
Meine Fragen:
- Wenn dies in einer Swing-Anwendung gehen wir nicht zu kümmern brauchen, um über den Anruf zu
show
am EDT setzen?
siehe - Kann jemand sonst Probleme mit der Bedienung dieses in einem Swing-app?
Dies wurde von dieser interessanten Antwort Spiele-Programmierung inspiriert.
Lösung
In der Regel nicht. Malerei auf einem anderen Thread als der Event Dispatch Thread (EDT) < a /> Ergebnisse in unerwünschten Artefakte, obwohl die Ergebnisse können akzeptabel sein. Diese Beispiel zeigt einige der Kompromisse. Ich ziehe die Anordnung auf dem EDT ziehen mit javax.swing .Timer , aber andere Ansätze möglich sind. Auch gewählten Top-Level Container kann implementieren bereits eine Buffer Strategie .
Andere Tipps
Wie bereits erwähnt durch trashdog es nicht sinnvoll ist, dies zu tun. Erstellen Sie eigene Animation Threads, Bild wird draw-Bildschirm aus. Dann schieben Sie es bis zu einem gewissen Halter. Wenn paintcomponent genannt aktuelles Bild holen und sie auf Komponente zeichnen. Getan. Schauen Sie sich Rendezvous Muster.