Мне нужно l oop через все массивы для рендеринга / обновления материала
Вам не нужно этого делать.
Для рендеринга материала вам действительно нужно учитывать только те блоки, которые находятся рядом с игроком. Вот код (x
, y
- координаты игрока, width
, height
- размеры вашего мира, render(x, y)
- это заполнитель для вашей функциональности рендеринга, и для простоты я предположил, что игрок может увидеть 100 блоков в каждом направлении):
for (int i = Math.max(x-100, 0); i ≤ Math.min(x+100, width); i++) {
for (int j = Math.max(y-100, 0); j ≤ Math.min(y+100, height); j++) {
render(i, j);
}
}
Процесс обновления также можно упростить:
Для npcs вам нужно всего лишь проверить несколько блоков вокруг него.
Для обновлений блоков (протекание жидкости, падение песка, распространение порчи и т. Д.) На самом деле есть две возможности:
- Итерировать разные части массива при каждом обновлении:
Обновления блоков не должно быть так часто. Для потока жидкости может быть достаточно обновлять только каждый 50-й блок в каждом обновлении. - Вы можете сохранить блоки, которые, возможно, потребуется обновить, в
ArrayList
(я предлагаю сохранять только координаты, а не сам блокирует).
Затем, когда функция обновления вызывается, вы go через этот список проверяете, действительно ли блоку требуется обновление. В этом случае вы добавляете соседние блоки в список, который затем будет обновлен на следующей итерации.
Убедитесь, что вы удалили только что обновленные блоки из списка, и избегайте добавления дубликатов!
В то время как второй подход обычно быстрее (обычно список определяется только действиями игрока, и даже если игрок решит осушить весь океан, весь список, вероятно, займет менее ¹⁄₂₀ всего мира).
Но первый подход, безусловно, легче реализовать, и он будет быстрее, если по какой-либо причине у вас будет много обновлений блоков.