Können Animationen in JavaFX "verschluckt" werden?

R

Rock45

Aktives Mitglied
Hallo.

Ich programmiere gerade ein Poker-Spiel, in dem ich den Spielern natürlich auch Karten zuweise.
Eine kurze Animation davon findet man hier.

Wenn eine Runde ausgespielt ist, werden die Karten wieder neu ausgegeben. Blos habe ich das Problem, dass die Animation nicht immer funktionert. Mal werden alle ausgegeben, mal erhält ein Spieler nur eine Karte...

Animation:
  //wird aus der Model-Klasse für jede Karte aufgerufen
   public void drawCard(PokerPlayer p, int i, int j, int k)
    {
        this.animateCard(p, i, j, 800, 800, k);
    }

    private void animateCard(PokerPlayer p, int i, int j, int translateDuration, int rotateDuration,
            int delayMultiplyer)
    {
       //Die zu animierende Karte
        ImageView card = p.getCards()[i];
        Point cardPos = p.getCardPos()[i];

        card.setTranslateX(this.stack.getX());
        card.setTranslateY(this.stack.getY());
        this.addRemoveAll(card);
        //Rotationsanimation
        RotateTransition rT = this.getRotTrans(card, rotateDuration);
        //Kartenbewegung vom Stack zur Position
        TranslateTransition tT = this.getTranslTrans(card, cardPos.x, cardPos.y, translateDuration);
        //hier wird alles zusammengefügt und gestartet
        this.setTransition(new ParallelTransition(), delayMultiplyer, tT, rT);
    }

Am Anfang funktioniert die Animation immer. Nur zwischen den einzelnen Runden kommt es dann zu dem "Ruckler". Kann es sein, dass eine Animation irgendwie verschluckt oder übersprungen wird bzw. eine andere Animation irgendwie stören kann?
 
Blender3D

Blender3D

Top Contributor
Am Anfang funktioniert die Animation immer. Nur zwischen den einzelnen Runden kommt es dann zu dem "Ruckler". Kann es sein, dass eine Animation irgendwie verschluckt oder übersprungen wird bzw. eine andere Animation irgendwie stören kann?
Das kann viele Gründe haben. Und ist nicht zwangsläufig JavaFX geschuldet.
Z.B. Unter Linux ist OpenGL oft per Default deaktiviert. Das führt zu einer verringerten Framerate.
Open Gl aktivieren:
System.setProperty("sun.java2d.opengl", "true");
Ein weiteres Problem stellte der Umgang mit Resursen dar. Das laden von Images , Sounds benötigt immer Zeit und kann zwar Anfangs gut funktionieren. Wenn aber die Speicherverwaltung aufräumen muss oder andere Threads laufen kann es zu Geschwindigkeitseinbrüchen kommen. Daher benutzt man am Besten einer Klasse die die bereits geladenen Images vorhält und on Demand zur Verfügung stellt.
In einem Animationsloop sollten Klassen möglichst nicht ständig erzeugt werden. Das belastet den Garbagecolletor unnötig.
Deine Animation für die rotierenden Karten benutzt wahrscheinlich ein Image, dass schrittweise rotiert und dargestellt wird. Es wäre für die Performance von Vorteil, wenn Du die Karte in verschiedenen Winkeln schrittweise z.B. 10° Schritten speicherst und jede Animation kann dann immer auf die passend geladene Karte zugreifen.
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Z.B. Unter Linux ist OpenGL oft per Default deaktiviert. Das führt zu einer verringerten Framerate.
Open Gl aktivieren:
System.setProperty("sun.java2d.opengl", "true");
Das bezieht sich auf Art/Swing, JavaFX nutzt im Hardware Acceleration, wenn es verfügbar ist, kann man mit -Dprism.verbose=true testen,

Ein weiteres Problem stellte der Umgang mit Resursen dar. Das laden von Images , Sounds benötigt immer Zeit und kann zwar Anfangs gut funktionieren. Wenn aber die Speicherverwaltung aufräumen muss oder andere Threads laufen kann es zu Geschwindigkeitseinbrüchen kommen. Daher benutzt man am Besten einer Klasse die die bereits geladenen Images vorhält und on Demand zur Verfügung stellt.
In einem Animationsloop sollten Klassen möglichst nicht ständig erzeugt werden. Das belastet den Garbagecolletor unnötig.
Deine Animation für die rotierenden Karten benutzt wahrscheinlich ein Image, dass schrittweise rotiert und dargestellt wird. Es wäre für die Performance von Vorteil, wenn Du die Karte in verschiedenen Winkeln schrittweise z.B. 10° Schritten speicherst und jede Animation kann dann immer auf die passend geladene Karte zugreifen.

Der "Animationsloop" wird von JavaFX selbst gesteuert, da kann man weder das Laden von Resourcen noch von Klassen sinnvoll beeinflussen (bzw, beides passiert dabei nicht "einfach so".)
Sich da einzuhacken und selbst mit vorgerenderten Images zu arbeiten, ist vermutlich eher kontraproduktiv und dürfte in allgemeinen Fall eher zu optisch schlechteren Ergebnissen führen.
 
Zuletzt bearbeitet:
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Am Anfang funktioniert die Animation immer. Nur zwischen den einzelnen Runden kommt es dann zu dem "Ruckler". Kann es sein, dass eine Animation irgendwie verschluckt oder übersprungen wird bzw. eine andere Animation irgendwie stören kann?
Schwierig, da ohne mehr Informationen etwas sinnvolles zu zu sagen.

Könnte sein, dass du ein Memory-Leak hast, der Speicher vollläuft und deshalb der GC ständig dazwischen grätscht.
Könnte auch sein, dass du mit irgendwas die CPU sehr belastetet, zb weil immer mehr Threads gestartet werden, die irgendwas machen.
Könnte auch sein, dass es immer mehr Nodes werden, und der Renderer nicht hinterherkommt.


Du könntest mal mit Scenic View drauf gucken, ob du irgendwas auffälliges siehst. Außerdem könntest du mit 'nem Profiler prüfen, wie sich Speicher- und CPU-Last verhalten

Java:
this.addRemoveAll(card);
Wat?
 
R

Rock45

Aktives Mitglied
Hallo ihr beiden. Danke für eure ausführlichen Nachrichten. Mir ist auch bewusst, dass das wohl an vielen Kleinigkeiten liegen kann, die im Programm sind, aber ich dachte, ich versuch es mal, selbst wenns nicht klappt. :)
Also zum Thema Animation. Was ich jetzt mal versucht habe ist die Animationen der Karten wegzulassen und sie einfach an der Endposition einzusetzen. Siehe Code.

Java:
    private void animateCard(PokerPlayer p, int i, int j, int translateDuration, int rotateDuration,
            int delayMultiplyer)
    {
        ImageView card = p.getCards()[i];
        Point cardPos = p.getCardPos()[i];

        card.setX(cardPos.x);
        card.setY(cardPos.y);
        this.getPane().getChildren().add(card);

    }

Hat nicht funktioniert. Die Karten werden auch nicht dauernd neu geladen. Am Anfang wird einfach das Bild der verdeckten Karte als static Image eingebunden und beim Starten des Programms wird das Image für die ImageView gesetzt.

Ich habe jetzt auch nach Threads geschaut, aber die Anzahl der Threads ändert sich nicht und ich kann auch nicht feststellen, dass der Speicher sich ändert.
Ich habe auch schon versucht mal alle anderen Animationen wegzulassen, bekomme aber immer dasselbe Ergebnis.

Auch wenn ich mir nach der Fehlerzeichnung getPane().getChildren.indexof(card); aurufe, wird mir der Index der Karte auf dem Pane angezeigt. Sie ist also da, wird aber einfach nicht gezeichnet. Und die Tatsache, dass es mal so und mal so ist und es auch immer unterschiedliche Karten sind, macht mich einfach verrückt...


Achso...und wegen

Java:
this.addRemoveAll(card);

Das ist noch eine alte Methode. In ihr wird aber nur das oben zeigte

Java:
this.getPane().getChildren().add(card);

ausgeführt.

Eine der wenigen Sachen, die mir jetzt noch in den Sinn kommen:
Kann Platfor.runLater() solche Seideffekte herbeiführen? Mir ist ja bewusst, dass der Task in die Queue gelegt wird, allerdings gebe ich die Befehle immer in der Konsole ein. Sprich, das Poker ist keine zeitkritische Anwendungen. Dazwischen liegen schon mal 10 Sekunden, bis wieder was passiert.
 
R

Rock45

Aktives Mitglied
Okay. Ich hab den "Zufall" eingegrenzt.

Scheinbar werden alle die Karten, die schon in der Vorrunde bei den Spielern waren nicht angezeigt :)
Sprich, wenn alle Spieler, außer einer, die Karten folden, gewinnt der letzte Spieler die Runde. Starte ich eine neue Runde und kommen die Karten zu den Spielern, die sie davor gehalten haben, werden die nicht gezeichnet...

Am Ende einer Runde laufe ich durch alle Kinder mit

Java:
this.getPane().getChildren()

speichere die in einer ArrayList, welche vom Typ Card bzw. ImageView sind und lösche die dann.

Ich gehe davon aus, dass da irgendwo das Problem liegt?! Die Karten werden auch gelöscht, wenn ein Spieler foldet....
Gelöscht gleich

Java:
this.getPane().getChildren().remove(node)

und später dann wieder mit this.getPane().getChildren().add(node) hinzugefügt. Scheinbar werden die da auch wieder hinzugefügt, aber eben nicht gezeichnet.
 
Zuletzt bearbeitet:
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Nach remove und add ist die Reihenfolge anders, liegt es u.U. daran, zB weil irgendwas die anderen Karten verdeckt?
 
R

Rock45

Aktives Mitglied
Nach remove und add ist die Reihenfolge anders, liegt es u.U. daran, zB weil irgendwas die anderen Karten verdeckt?

Leider nein. Ich habe mir auch die Positionen von allen Nodes ausgeben lassen.

Ich habe das Problem jetzt zwischenzeitlich auch gelöst.
Die Karten (welche von ImageView ableiten) werden nach jeder Runde neu erstellt. Bisher habe ich die Karten, wie geschrieben, nur zu Beginn des Programms erstellt und den Objekten der Klasse Spieler in jeder Runde zugewiesen. Die Kartenobjekte waren also dieselben und genau die, werden aus irgendeinem Grund nicht mehr gezeichnet.
Ich bin leider schon so lange aus JavaFX raus, dass mir da einfach das Wissen dahinter fehlt, als das ich erklären kann, was schiefgelaufen ist. Mittlerweile ist der Code auch so riesig, dass ein Minimalbeispiel viel Aufwand bedeuten würde.

Aber die Tatsache, dass ich nach jeder Runde die neuen Karten-Objekte erstelle, ist zumindest meine Lösung, falls irgendwer auf ein ähnliches Problem stolpern sollte. :)
 
Blender3D

Blender3D

Top Contributor
Die Karten werden auch nicht dauernd neu geladen. Am Anfang wird einfach das Bild der verdeckten Karte als static Image eingebunden und beim Starten des Programms wird das Image für die ImageView gesetzt.
Die Rotation der Karten benötigt verschiedne rotierte Bilder. Falls diese immer wieder berechnet werden ...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N was kann bzw was ist neu an JavaFx was die anderen nicht können AWT, Swing, JavaFX & SWT 2
A Swing Paint mit Button Clear den Hintergrund säubern um wieder zeichnen zu können AWT, Swing, JavaFX & SWT 2
X Java Komponenten jeder Zeit hinzufügen können AWT, Swing, JavaFX & SWT 3
N Swing Java Komponente zur Darstellung von klickbaren Links, die Java Funktionen ausführen können AWT, Swing, JavaFX & SWT 2
O Swing es können keine neuen Labels hinzufügt werden während der Timer läuft AWT, Swing, JavaFX & SWT 14
V Nur zulässige Zeichen in JTable-Zellen eintragen können AWT, Swing, JavaFX & SWT 2
Spot84 Text mit Notizen versehen können AWT, Swing, JavaFX & SWT 2
A 1. Fenster sperren können AWT, Swing, JavaFX & SWT 5
T Timer und GIF Animationen pausieren während Maus sich bewegt AWT, Swing, JavaFX & SWT 4
A JavaFX Zeitversetzte Animationen AWT, Swing, JavaFX & SWT 3
H Gif Animationen zentrieren AWT, Swing, JavaFX & SWT 9
R Berechnung von Animationen AWT, Swing, JavaFX & SWT 7
Maxim6394 Java 3d - Animationen importen AWT, Swing, JavaFX & SWT 6
Weiti Swing Animationen - Drehung aller Komponenten auf Knopfdruck AWT, Swing, JavaFX & SWT 12
J Balkendiagramm und Gif animationen AWT, Swing, JavaFX & SWT 4
J 3D-Animationen in Swing-Fenster AWT, Swing, JavaFX & SWT 2
S JavaFX - mit Listener Veränderungen in einer TableView abhören AWT, Swing, JavaFX & SWT 3
dtr84 JavaFX/OpenJFX mittels Apache Ivy einbinden (Java 11) AWT, Swing, JavaFX & SWT 18
D runnable Jar mit Javafx erstellen(Eclipse) AWT, Swing, JavaFX & SWT 10
Monokuma Blöcke erzeugen (JavaFX) AWT, Swing, JavaFX & SWT 1
P JavaFx - Progressbar - Füllen mittels mehreren Tasks AWT, Swing, JavaFX & SWT 0
Rafael.Cupari JavaFx Installer AWT, Swing, JavaFX & SWT 16
Monokuma Swing zu JavaFX AWT, Swing, JavaFX & SWT 3
C JavaFx sound abspielen AWT, Swing, JavaFX & SWT 3
C JavaFX mit CSS in Eclipse AWT, Swing, JavaFX & SWT 2
parrot JavaFX Fehler AWT, Swing, JavaFX & SWT 4
B JavaFX JavaFX Anwendung deployen (entw als runnableJAR oder exe-Datei) AWT, Swing, JavaFX & SWT 15
N JavaFX applikation auf anderen Systemen zum laufen bringen AWT, Swing, JavaFX & SWT 7
W JavaFX JavaFX - TreeView will nicht AWT, Swing, JavaFX & SWT 8
H JavaFX JavaFX - Scene Builder - BorderPane AWT, Swing, JavaFX & SWT 23
D Columns unabhängig voneinander mit Daten füllen JavaFx AWT, Swing, JavaFX & SWT 1
C JavaFX Installation unter IntelliJ IDEA AWT, Swing, JavaFX & SWT 5
J JavaFX Label aktualisieren AWT, Swing, JavaFX & SWT 18
H JavaFX JavaFX Import Fehler AWT, Swing, JavaFX & SWT 4
M JavaFX javaFX Label-Text wird nicht gesetzt AWT, Swing, JavaFX & SWT 3
T Szene wechselen JavaFX mit If in Main Class AWT, Swing, JavaFX & SWT 2
S JavaFx Zufallsfarbe beim Button-Klick AWT, Swing, JavaFX & SWT 22
M JavaFX JavaFX in mehrere Controller AWT, Swing, JavaFX & SWT 21
R javafx erste application AWT, Swing, JavaFX & SWT 12
kneitzel JavaFX - Binding & Co AWT, Swing, JavaFX & SWT 42
S Alternative JavaFX TableView AWT, Swing, JavaFX & SWT 1
B Game of Life in JavaFX AWT, Swing, JavaFX & SWT 5
B eclipse für JavaFx setuppen AWT, Swing, JavaFX & SWT 4
N JavaFX Chioceboxen verküpfen AWT, Swing, JavaFX & SWT 0
J JavaFX Controls AWT, Swing, JavaFX & SWT 4
S JavaFx AWT, Swing, JavaFX & SWT 2
Tashtego JavaFX + Mobile AWT, Swing, JavaFX & SWT 9
JavaTalksToMe JavaFx ExekutorService Problem AWT, Swing, JavaFX & SWT 2
L JavaFX Javafx Dependency-Inversion AWT, Swing, JavaFX & SWT 19
OSchriever JavaFX JavaFX auf Raspberry Pi 4 AWT, Swing, JavaFX & SWT 6
M JavaFX Tab auswählen mit JavaFX AWT, Swing, JavaFX & SWT 9
J JavaFX JavaFX Splitpane - Zugriff auf die Controller der Elemente AWT, Swing, JavaFX & SWT 8
M Java und JavaFX 13 läuft endlich AWT, Swing, JavaFX & SWT 4
N JavaFX Logging des JavaFX Application Threads mit Log4J AWT, Swing, JavaFX & SWT 3
L Java FX JavaFX Effect Attribute ausdrucken AWT, Swing, JavaFX & SWT 1
Hatsi09 JavaFx Mediaplayer seltsames Verhalten AWT, Swing, JavaFX & SWT 0
Tashtego JavaFX - Datenübergabe zwischen Scenes AWT, Swing, JavaFX & SWT 8
Zrebna JavaFX-Projekt mit Bildern funktioniert nicht - um Hilfe wird gebeten AWT, Swing, JavaFX & SWT 14
S Kann javafx.scene.layout.VBoxBuilder nicht importieren AWT, Swing, JavaFX & SWT 3
Bluedaishi JavaFX Programm start mit zwei scenen bzw Fenster AWT, Swing, JavaFX & SWT 1
S Jogl und JavaFX AWT, Swing, JavaFX & SWT 6
Bluedaishi JavaFX ProgressBar AWT, Swing, JavaFX & SWT 10
S JavaFX JavaFX TableView scrollen färbt falsche Zeilen AWT, Swing, JavaFX & SWT 1
F JavaFX JavaFX Builden: JavaFX Runtime components are missing AWT, Swing, JavaFX & SWT 0
F JavaFX wirft zufällig Exceptions AWT, Swing, JavaFX & SWT 5
M JavaFX JAVAFX TreeItem mit Tooltip versehen AWT, Swing, JavaFX & SWT 4
techM JavaFX -> CSS AWT, Swing, JavaFX & SWT 5
J JavaFx TableView mit CheckBox AWT, Swing, JavaFX & SWT 4
J JavaFX Stoppuhr mit javafx.timeline AWT, Swing, JavaFX & SWT 2
B Problem mit JavaFX AWT, Swing, JavaFX & SWT 5
O Zukunft von Swing und JavaFX ? AWT, Swing, JavaFX & SWT 3
L JavaFX auf dem PI 4 installieren AWT, Swing, JavaFX & SWT 2
L JavaFX JavaFX Forms mit Groovy starten AWT, Swing, JavaFX & SWT 1
K JavaFX CSS Border (Verschiebung verhindern) AWT, Swing, JavaFX & SWT 4
K JavaFX Element in HBOX nach rechts verschieben AWT, Swing, JavaFX & SWT 2
M error: package javafx.scene.web is not visible import javafx.scene.web.*; AWT, Swing, JavaFX & SWT 16
J import javafx.fxml* bei JavaFX 13 geht nicht mehr AWT, Swing, JavaFX & SWT 7
F Kein JavaFX mehr im Eclipse Wizard AWT, Swing, JavaFX & SWT 1
N Ausführbare Datei aus JavaFX Projekt erstellen AWT, Swing, JavaFX & SWT 22
N Array mit JavaFX Elementen AWT, Swing, JavaFX & SWT 9
S JavaFX Exception in thread "JavaFX Application Thread" AWT, Swing, JavaFX & SWT 3
W JavaFX JavaFX - Spalten auf ganze SpreadsheetView verteilen AWT, Swing, JavaFX & SWT 16
L Label im JavaFX Thread Updaten AWT, Swing, JavaFX & SWT 3
S Erwaege JavaFX Einstieg AWT, Swing, JavaFX & SWT 27
O JavaFX mini Taschenrechner! AWT, Swing, JavaFX & SWT 35
L JavaFX JavaFX, FXML und Guice? AWT, Swing, JavaFX & SWT 0
B JavaFX habe mein Problem fett markiert AWT, Swing, JavaFX & SWT 2
L Javafx Controller Klasse in Maven AWT, Swing, JavaFX & SWT 7
L JavaFX JavaFX stürtzt durch einen Server#connect Exception AWT, Swing, JavaFX & SWT 3
Shallty JavaFX MenuItem (Info) Icon ändern AWT, Swing, JavaFX & SWT 7
E Aktuelle Uhrzeit auf jeder Stage anzeigen lassen (JavaFX) AWT, Swing, JavaFX & SWT 2
temi JavaFX Problem mit IntelliJ und JavaFx 11 unter XUbuntu AWT, Swing, JavaFX & SWT 3
L Java FX Problem mit Ubuntu 18 und JavaFx AWT, Swing, JavaFX & SWT 27
L JavaFX JavaScript im Javafx Webview AWT, Swing, JavaFX & SWT 4
pkm Ich kann JavaFX nicht installieren AWT, Swing, JavaFX & SWT 4
A JavaFX Daten in eine HTML-Table mit JS schreiben AWT, Swing, JavaFX & SWT 3
L JavaFX JavaFX Diagram Editor AWT, Swing, JavaFX & SWT 3
L JavaFX JavaFX Application mit Preloader sauber runterfahren AWT, Swing, JavaFX & SWT 10
K JavaFX funktioniert nicht AWT, Swing, JavaFX & SWT 2
G JavaFX Slider in JavaFX beide Seiten beschriften AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Anzeige

Neue Themen


Oben