У вас есть две очень разные вещи для управления:
Сервер должен управлять всем миром авторским способом. Для этого необходимо общение с N клиентами (где N "массивный").
В принципе, клиент может знать обо всем мире, но это не нужно . Для клиента достаточно знать, что находится рядом с игроком. Предполагая, например, довольно грубое разбиение в виде сетки, необходимо знать только ячейку игрока и 26 ячеек вокруг игрока (или 8 ячеек, если у вас есть двумерная сетка). Несколько более мелкая сетка лучше, но вы поняли идею.
Теперь много пикапов, что такое «много»? Вы копаете, может быть, 5 вещей в секунду, это, может быть, два десятка номеров, которые необходимо обновить на сервере, и серверу, возможно, придется передавать их другому игроку, чья область интересов перекрывает вашу ячейку. Для компьютера это довольно смешной объем данных и пренебрежимо малый объем вычислений. Это может стать проблемой, когда в одной и той же ячейке сотни / тысячи игроков (тогда ваше разделение будет слишком грубым).
Серверу не нужно ни знать, ни заботиться о ротации пикапов или подобных деталях. С чего бы это?
Клиенту на самом деле тоже все равно, так как это всего лишь глазной леденец, который клиент может сделать на лету.
С точки зрения сервера необходимо знать, что вы копали в (30, 40, 50) в узле, в котором вы находитесь, и решает, что это порождает, например, три объекта типа 5 или один объект типа 7 с счет 3. Это все, что его волнует, и это все, что он говорит вам. Он также будет включать эту информацию в данные, отправляемые кому-либо, перемещающему свою область интереса через ячейку сетки позже (при условии, что она все еще там к тому времени).
Клиенту говорят, что там появилось три объекта, бла-бла. Теперь, показывает ли клиент карту ASCII-искусства, где теперь есть буква «D», или показывает вращающуюся кучу грязи, все равно. Независимо от того, имеют ли сваи разные повороты или вращаются только те, которые находятся рядом с вашим игроком, это тоже одно и то же. Это просто материал, который отображается на вашем мониторе, это ни на кого не влияет.
Таким образом, в конкретном случае, когда вы хотите вращать только близлежащие кучи грязи, вы можете просто выполнить проверку дальности всех объектов, о которых вы знаете. Поскольку набор данных не большая, даже грубая сила на все будет работать.
Вы можете (и должны), в зависимости от размера вашего раздела, тривиально удалять ненужные ячейки сетки.
Вы можете, конечно, дополнительно подразделить свою клетку и использовать что-то очень умное. Если хотите, используйте kd-Tree, но не ожидайте огромных успехов. Вы можете обрезать вещи с помощью манхэттенской злости, или вы можете сортировать свои вещи в маленькой собственной сетке ... но почему?
Проверка расстояния (действительно квадратное расстояние, но оно то же самое для вас) - это просто два умножения и сложение (оптимизированное для MUL, MADD, так что на самом деле это просто две операции), за которым следует ветвление или условное перемещение. Это почти так же быстро, как и любая другая операция, которая не удаляет целые ячейки сетки одновременно. На самом деле, это то, что вы могли бы даже сделать на GPU ...
Видя, как у вас будет несколько сотен или самое большее несколько тысяч проверок расстояния на одну и ту же позицию (квадратное расстояние отлично работает), у вас действительно не возникнет особых проблем с выполнением этого вычисления, тем более, что это скорее кэш-память. дружественная итерация по непрерывной памяти, и с условными ходами, это очень дешево. Нечто подобное (псевдокод) rot = r[i] + 1; r[i] = ((dx*dx+dy*dy) < DIST_SQ) ? rot : r[i];
. Это одна итерация массива из нескольких сотен значений на кадр. Компьютер не должен заботиться об этом, это непрерывные загрузки и хранилища, простой ALU, нет веток и всего несколько тысяч итераций.
Это (многие-к-одному) не тот же класс проблем (многие-ко-многим), что и на сервере. На самом деле, клиент не проблема.
minecraft:dirt
) и счет (30), так что, когда игрок находится достаточно близко, чтобы поднять его, он просто добавляет как можно больше счета в инвентарь игрока. Если у игрока есть место только для 6 предметов, а стопка из 30 находится на земле, игрок соберет 6, а