Ошибочные решения

Этих решений следует избегать, поскольку они могут привести к утечке памяти («OutOfMemoryError»), отставанию или несоответствиям.

Storing References

Some instances such as

should NEVER be stored or cached in plugins.

These are the main reasons for this:

  • The references prevent proper garbage collection

  • The instances might no longer be valid

Этого можно легко избежать, используя соответствующие снимки или сохраняя уникальные идентификаторы данных экземпляров, а также запрашивая живой экземпляр, когда вам это нужно.

IO on the main thread

Выполнение некоторых операций ввода-вывода, таких как загрузка файла конфигурации/данных или проверка обновлений/подключения к веб-сайту, занимает много времени и сильно влияет на TPS на сервере. Такие задачи должны выполняться либо в их собственных потоках, либо с использованием асинхронной функции встроенного планировщика. И все-таки совершенно нормально загружать необходимые файлы/конфигурации в основной поток во время запуска сервера/инициализации плагина.

Sponge.asyncScheduler().submit(Task.builder().execute(this::checkForUpdates).build());

For more details refer to the scheduler docs.

Если это сделано неправильно, вы можете столкнуться с перерывом в работе клиента, или сторожевой таймер может даже убить сервер.

Accessing game objects outside the main thread

Доступ к игровым объектам вне основного потока может привести к сбоям, несоответствиям и другим проблемам, которых следует избегать. Если у вас есть длинная операция в другом потоке, используйте планировщик scheduler, чтобы внести изменения в такие игровые объекты в основном потоке. Если вы хотите использовать игровой объект в другом потоке, используйте моментальный снимок экземпляра или отдельного контейнера данных.

Предупреждение

Если это сделано неправильно, вы можете получить «ConcurrentModificationException», в лучшем случае - с или без сбоев сервера, а в худшем случае - с поврежденными игроком/миром/сервером.