Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите Как из HashMap вытащить всех игроков которые там есть?

Тема в разделе "Разработка плагинов для новичков", создана пользователем HunterGaming, 9 дек 2016.

  1. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    76
    Ну давайте ещё раз обсудим... Я в таких обсуждениях ни разу не участвовал.
    Т.е. если хранить не Player, а String, то GC будет удалять эти элементы что ли? Это уже вопрос говнокода. Т.е. при выходе игрока строку удалять можно, а игрока нет? Да с Player'ами даже с шедулерами всякими проще будет - у Player (OfflinePlayer) есть метод isOnline().
    Хранить String есть только в том случае, если предполагается, что игрок потом будет перезаходить. Но прикол в том, что при остановке сервера в любом случае нужно будет сохранять всё это дело в файл.
    Кто-то ещё, помнится, говорил, что объект Player нестабилен, но это больше звучит, как бред. По крайней мере в версиях 1.5+ Player не пересоздаётся, пока игрок находится на сервере.

    Кстати в новых версиях следует использовать UUID (даже для offline-mode). Единственное, правда, что в этом случае регистр букв в нике нельзя учитывать.

    С мирами такая же ситуация - ссылки нельзя хранить, только если предполагается, что миры будут выгружаться и загружаться в рантайме... Уж не знаю, для чего может пригодиться хранение имени мира вместо самого мира...
    А с локациями вообще не понял. Локация может пострадать, только если, опять же, мир накроется. Это что ж обстоятельства такие должны быть?

    А ещё ваши создаваемые строки весят значительно больше, чем ссылки на объекты.

    Короче говоря, полный бред, по моему мнению. Храню Player'ов, World'ы, Location'ы, экономлю на процессорном времени, утечек нет.
    Ещё, как отметил человек выше, существуют weak references, если уж кодер совсем ленивый (или дурак)...
     
    Последнее редактирование: 16 дек 2016
  2. Хостинг MineCraft
    <
  3. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Я кстати тоже замечал. что getOnlinePlayers прожорливый.
     
  4. GoodCoder

    GoodCoder Активный участник Пользователь

    Баллы:
    76
    Это ещё почему? Строка - это набор байт, а вот игрок - объект со множеством свойств и содержит ссылки на другие объекты. Почему хранить ник/UUID? Весит меньше, позволяет сохранить привязку к игроку после перезахода (объект player новый создаётся) и не мешает сборщику мусора удалять вышедших игроков.
    Если нужно хранение данных лишь в течении сессии, то да, можно в Weak-коллекции хранить ссылки на объекты игроков.
     
  5. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    76
    Ссылка на объект весит 4 байта. Новая строка - 20+ байт и опять же ссылка - ещё 4 = в сумме 24.
    Если уж прям так нужно хранить оффлайн-игроков, лучше для этого использовать отдельный список. Выше уже говорилось о том, что каждый раз получать игрока при помощи баккита - это не очень хорошо.
     
  6. GoodCoder

    GoodCoder Активный участник Пользователь

    Баллы:
    76
    Почему вес объекта не учитываешь? Ссылка куда то же ссылается.
     
  7. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    76
    Потому что пока игрок онлайн, эта информация будет находиться в ядре в любом случае. Ты можешь в качестве ключа мапы хранить хоть String, хоть UUID, Player от этого весить меньше не будет.
     
  8. Deamonish

    Deamonish Активный участник

    Баллы:
    61
    Все правильно говорит Dymeth. Ссылки Player'ов можно хранить, и даже удобнее. Мы храним ССЫЛКУ на объект, а не сам объект(Если игрок в сети, этот объект и так будет занимать место в куче(мы ведь сохраняем не сам объект в коллекцию, а только ссылку на него)). Если разраб не глупый, то он коллекции чистит, при выходе игрока. Следовательно, никаких утечек не будет, и не потребуется тратить ресурсы на лишние вызовы Bukkit.getPlayer(UUID); Другое дело, что можно создать утечку, и хранить экземпляры игроков, что уже не играют(т.е не удалять игроков при выходе), из-за чего ссылки остаются не давая их скушать мусорщику. Но это уже фейл разработчика.
     

Поделиться этой страницей