- 236
- 4
- 22
Всем здравствуйте. Есть такой вопрос: какой наиболее оптимизированный способ подсчёта определённых блоков в конкретном чанке? (И нет, не для лимитера блоков на чанк) Если что, мне нужна возможность, чтобы по worldObj + x и z координат + Block + meta(блока) можно было узнать, сколько таких блоков есть в проверяемом чанке. Притом возможность получить такую информацию мне нужна примерно раз в 4-5 секунд, может даже чаще (из ивентов вызываться будет, если что). На текущий момент, у меня в голове лишь 2 идеи, как такое реализовать. Но обе из них имеют большие проблемы по оптимизации....
1 способ - вложенные 3 цикла и перебор всех блоков в чанке с подсчётом нужных мне. Учитывая, что чанк очень большой (особенно в высоту) - это будут жёсткие тормоза.
2 способ - "кеш" в WSD. То есть создать WSD с разделением по мирам, а дальше внутри WSD мапа с чанками и обжеками, в которых будут блоки и их кол-во. В итоге при обращении к WSD для получения информации идёт проверка, есть ли такая информация в "кеше". Если есть - выдаём, иначе тут же 3 циклами перебираем чанк чтобы получить эту информацию, кладём в кеш и возвращаем её. Этот способ, конечно, лучше предыдущего, но требуется триггер на обновление блока в мире, чтобы поддерживать "кеш" в актуальном состоянии, собственно тут то и проблема в этом способе, ведь ивента на setBlock так такого нет, только ивенты с игроком, а если вызывается worldObj#setBlock из команды /setblock или просто в каком-то моде - триггериться нечем. Пихать свой хук в setBlock - не думаю, что лучший вариант...
Может быть у вас есть более хорошие способы, как быстро посчитать кол-во определённых блоков с опред. метой в указанном чанке? Главное, чтобы не было тормозов от просчёта. Возможно в самом Chunk есть какой-то кеш на подобный случай, но я его не нашёл. Во всяком случае, надеюсь, кто-нибудь мне поможет. Заранее спасибо!
1 способ - вложенные 3 цикла и перебор всех блоков в чанке с подсчётом нужных мне. Учитывая, что чанк очень большой (особенно в высоту) - это будут жёсткие тормоза.
2 способ - "кеш" в WSD. То есть создать WSD с разделением по мирам, а дальше внутри WSD мапа с чанками и обжеками, в которых будут блоки и их кол-во. В итоге при обращении к WSD для получения информации идёт проверка, есть ли такая информация в "кеше". Если есть - выдаём, иначе тут же 3 циклами перебираем чанк чтобы получить эту информацию, кладём в кеш и возвращаем её. Этот способ, конечно, лучше предыдущего, но требуется триггер на обновление блока в мире, чтобы поддерживать "кеш" в актуальном состоянии, собственно тут то и проблема в этом способе, ведь ивента на setBlock так такого нет, только ивенты с игроком, а если вызывается worldObj#setBlock из команды /setblock или просто в каком-то моде - триггериться нечем. Пихать свой хук в setBlock - не думаю, что лучший вариант...
Может быть у вас есть более хорошие способы, как быстро посчитать кол-во определённых блоков с опред. метой в указанном чанке? Главное, чтобы не было тормозов от просчёта. Возможно в самом Chunk есть какой-то кеш на подобный случай, но я его не нашёл. Во всяком случае, надеюсь, кто-нибудь мне поможет. Заранее спасибо!