Доброго времени суток, господа. Столкнулся я со следующей задачей: применение довольно сложного предиката к чанку, проверяющего его на наличие N количества блоков, подходящих под определённые условия. Например, нужно узнать, есть ли в чанке 40 блоков пашни под открытым небом, 4 сундука и верстак. Важное уточнение: нужно, проверять только на минимальное кол-во выбранных блоков, а не эквивалентность. Также мы не проверяем тайл энтити блоков.
Первое, что приходит на ум, это использовать тройной for, но потенциально это 16 * 16 * 256 = 65536 циклов. Игнорируя блоки воздуха, и предполагая, что в среднем такая проверка найдёт все нужные блоки за 75% шагов, мы получаем около 24500 циклов в случае успешной проверки. Благо, такая проверка применяется не очень часто - при взаимодействии с блоком, (после чего результат кэшируется), но может затрагивать несколько чанков за раз, максимум - 81 чанк за раз.
Вопрос предельно простой: как можно это оптимизировать?
Первое, что приходит на ум, это использовать тройной for, но потенциально это 16 * 16 * 256 = 65536 циклов. Игнорируя блоки воздуха, и предполагая, что в среднем такая проверка найдёт все нужные блоки за 75% шагов, мы получаем около 24500 циклов в случае успешной проверки. Благо, такая проверка применяется не очень часто - при взаимодействии с блоком, (после чего результат кэшируется), но может затрагивать несколько чанков за раз, максимум - 81 чанк за раз.
Вопрос предельно простой: как можно это оптимизировать?