Bad-Practices

Diese Bad-Practices sollten vermieden werden, da sie Memory-Leaks (OutOfMemoryError), Lags und Inkonsistenzen verursacht.

Speichern von Referenzen

Bestimmte Instanzen wie beispielsweise

sollten NIEMALS in Plugins gespeichert oder gecached werden.

Dies sind die Hauptgründe hierfür:

  • Die Referenzen verhindern das ordentliche Aufräumen von nicht länger benötigten Objekten

  • Die Instanzen sind möglicherweise nicht länger gültig

Dies kann einfach vermieden werden indem die entsprechenden Snapshots verwendet werden oder die UUID des Objektes gespeichert wird und du eine aktuelle Instanz anfragst, wenn du diese benötigst.

E/A auf dem Haupt-Thread

Das Ausführen von E/A Operationen wie das Laden von Konfigurationen/Daten oder das Suchen nach Updates bzw. das Verbinden zu einer Webseite benötigt viel Zeit und großen Einfluss auf die TPS des Servers. Derartige Aufgaben sollten entweder in eigenen Threads oder unter Verwendung des asynchronen Verarbeitungsfeatures des eingebauten Schedulers ausgeführt werden. Allerdings ist es vollkommen in Ordnung (Konfigurations-)Dateien auf dem Main-Thread zu laden, während der Server startet/das Plugin initialisiert wird.

this.game.getScheduler().createAsyncExecutor(this).execute(this::checkForUpdates);

Für mehr Informationen zu diesem Thema sieh dir dir Scheduler Doku an.

Wenn dies falsch gemacht wird, könntest du Clients sehen, die die Verbindung verlieren, oder der Watchdog könnte sogar den Server neustarten.

Zugreifen auf Objekte von außerhalb des Haupt-Threads

Das Zugreifen auf Spiel-Objekte von außerhalb des Haupt-Threads kann zu Abstürzen, Unstimmigkeiten und diversen anderen Problemen führen und sollte vermieden werden. Wenn du eine langwierige Operation auf einem anderen Thread ausführen möchtest, solltest du den Scheduler verwenden, um die nötigen Änderungen am Objekt wieder auf dem Haupt-Thread auszuführen. Wenn du das Spiel-Objekt in einem anderen Thread verwenden möchtest, verwende einen Snapshot der Instanz oder einen losgelösten Datencontainer.

Warnung

Wenn dies falsch gehandhabt wird, wirst du im besten Fall eine ConcurrentModificationException mit oder ohne Serverabsturz bekommen und im schlimmsten Fall einen defekten Spieler/Welt/Server.