Многие блоки не требуют обновления каждый игровой тик, это нужно только тем блокам, которые постоянно выполняют какое-то действие. Однако блоки вроде пшеницы или листвы должны иногда обновляться для проверки и обновления состояния, а факела - испускать частицы огня.
Листвы, пшеницы и факелов в мире крайне много, и потому регистрировать их как tile entity не представляется возможным из-за нагрузки, которую они в таком случае дадут.
Потому в MCPE существует механика случайных обновлений блоков, позволяющая блокам некоторого типа в произвольный момент обновляться и выполнять какое-то действие.
Случайные обновления являются сильнейшей оптимизацией и упрощением создания подобных процессов и далее будет описано, почему.
Случайный тик регистрируется как функция для какого-то типа блока (по его ID) и вызывается, когда такой блок где-то произвольно обновляется. Для каждого в мире блока в среднем такое обновление происходит раз в 1.5-2 минуты.
Для регистрации события случайного тика используется функция:
Block.setRandomTickCallback(id, function(x, y, z, id, data) {
// параметры: координаты, а также id и data обновляемого блока
});
Случайный тик идеально подходит для создания блоков, которые должны со временем изменяться (к примеру, расти). Даже достаточно большое кол-во блоков со случайным тиком в мире не создает большой нагрузки, главное, чтобы такими блоками не было заполнено более 5-10% всего мира.
Данная механика похожа на случайный тик, это тоже случайное событие для блока с каким-то ID и с теми же параметрами. Главное отличие в том, что это событие вызывается чаще, где-то раз в 5-10 секунд, однако только для блоков, рядом с которыми находится игрок.
Это крайне хорошо подходит для создания каких-либо анимаций, вроде испускания частиц, которое актуально только, если игрок находится в непосредственной близости. Для этого события так же существует ограничение, при котором он не вызывает нагрузки, это примерно те же 5-10% от объема пространства рядом с игроком.
Для регистрации события случайной анимации используется функция:
Block.setAnimateTickCallback(id, function(x, y, z, id, data) {
// параметры: координаты, а также id и data обновляемого блока
});