Генерация чанков (1.12.2)

428
41
108
Добрый день, столкнулся с такой интересной проблемой
В общем, я переложил генерацию чанка из основного потока в специально выделенный пул потоков, и почти успешно, за исключением вот таких артефактов

С чем данные ошибки могут быть связаны?


1701935442792.png1701936165256.png

И теперь подробнее к деталям

Цитирую @Liahim Принцип работы генератора чанков. Начало
(Хоть гайд и соотносится к более новым версиям, но это применимо и для 1.12.2 полагаю)

Многие, кто заглядывал в класс генератора, могли заметить две магические цифры: 5 и 33. В последних версиях эти цифры вынесены в настройки и от них зависит размер чанка, в версии 1.7.10 они были жёстко прописаны в коде. Меня тоже по началу сбивали с толку такие странные значения. А почему не 4 и 32, думал я, ведь это было бы логично. Размер чанка 16х16х256, делим это на 4 и 8 соответственно и получаем 4х4х32. Логично? Нет.
Дело в том, что каждый чанк генерируется независимо, и для того, чтобы наш ландшафт совпадал с ландшафтом соседних чанков, нужно указывать величину шума по его границам. То есть, значения в вершинах решётки на границе у двух смежных чанков будут одинаковыми. Отсюда и получается финальный размер решётки для одного чанка 5х5х33.
Всё это очень напоминает кристаллическую решётку, не так ли?
(Сам лично находил внутри ChunkGeneratorOverworld.generateHeightmap() при вызовах NoiseGeneratorOctaves.generateNoiseOctaves эти магические числа, спасибо автору за проделанную работу)

Что было сделано в процессе рассинхронизации? Весь ,,числовой кеш,, (включая числовые массивы, которые могут быть переиспользованы) внутри генераторов (ChunkGeneratorOverworld, BiomeProvider, IntCache) был перенесен в ,,кеш локального потока,, (Туда же перенес рандом) (до переноса вся карта была одним огромным артефактом), и получил ,,то как на скринах,, (если не хранить ,,кеш локального потока,, вообще - то результат тот-же самый)

Но по какой-то причине, ,,независимая генерация в разных потоках,, до сих пор не такая уж и не зависимая.
Приглашаю экспертов в данной области, подсказать где что я мог упустить

UPD еще 1 скрин

1701948263318.png
 
Последнее редактирование:
428
41
108
UPD все слои содержат 1 переменную (текущий сид), который используется во внутренних функциях псевдорандома, и который могли одновременно использовать разные потоки. Перенес и это в ,,кеш локального потока,,. Однако, это проблему все еще не решило
 
4,045
63
645
Мне кажется, надо рыть слои.
Тут на лицо смещение биомов в разных чанках/потоках. А сам генератор отрабатывает уже их.
Причём, фигня в каком-то отдельном слое.
Возможно, где-то затесался ещё один рандом )

Странно только, что смещение происходит только по одной оси.
Может, где-то x и z перепутал? ) Или где-то используется какая-то внешняя статичная переменная?
 
Последнее редактирование:
428
41
108
Мне кажется, надо рыть слои.
В общем ты оказался прав, не знаю что за ошибка, и где она была, но после отката слоев обратно ,,в нечитаемый вид,, все заработало
 
Последнее редактирование:
Сверху