Złe praktyki
Praktyki które należy unikać, mogą spowodować wyciek pamięci(memory leaks), opóźnienia lub wszelkiego rodzaju niespójności.
Przechowywanie odwołań
Niektóre przypadki, takie jak
- i pojemniki które MOGĄ zawierać jakikolwiek z powyższych elementów, w tym
Kolekcje
Mapy
nigdy nie przechowuj w pluginie.
Głównymi powodami są:
Odwołania uniemożliwiają prawidłowe usuwanie śmieci
Wystąpienia mogą już nie być ważne
This can easily be avoided by using the corresponding snapshots or saving the UUID of the given instances and requesting a live instance when you need it.
IO w głównym wątku
Wykonywanie operacji wejścia / wyjścia, takich jak ładowanie pliku, wszelkiego rodzaju zapytania do stron internetowych zajmują dużo czasu i blokują główny wątek serwera, wpływa to na TPS. Takie zadania powinny być wykonywane w osobnych wątkach lub przy użyciu funkcji asynchronicznej. Jednak ładowanie plików konfiguracyjnych serwera przy starcie jest jak najbardziej w porządku.
Sponge.asyncScheduler().submit(Task.builder().execute(this::checkForUpdates).build());
Więcej informacji można zdobyć w scheduler docs.
Jeśli zostanie to zrobione niepoprawnie, klientom może wyrzucić błąd, a nawet wyłączyć serwer.
Uzyskiwanie dostępu do obiektów gry poza głównym wątkiem
Accessing game objects outside of the main thread can lead to crashes, inconsistencies and various other problems and should be avoided. If you have a lengthy operation on a different thread use the scheduler to make changes to such game objects on the main thread. If you want to use a game object in a different thread use a snapshot of the instance or a detached data container.
Ostrzeżenie
If this is done wrong, you can get a ConcurrentModificationException
with or without a server crash at best and
a corrupted player/world/server at worst.