Bad-Practices
Diese Bad-Practices sollten vermieden werden, da sie Memory-Leaks (OutOfMemoryError
), Lags und Inkonsistenzen verursacht.
Speichern von Referenzen
Bestimmte Instanzen wie beispielsweise
- und Container, die die oben genannten Elemente enthalten könnten wie beispielsweise
Collections
Maps
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.
Sponge.asyncScheduler().submit(Task.builder().execute(this::checkForUpdates).build());
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.