- 434
- 41
- 110
Добрый день, столкнулся с такой интересной проблемой
В общем, я переложил генерацию чанка из основного потока в специально выделенный пул потоков, и почти успешно, за исключением вот таких артефактов
С чем данные ошибки могут быть связаны?
И теперь подробнее к деталям
Цитирую @Liahim Принцип работы генератора чанков. Начало
(Хоть гайд и соотносится к более новым версиям, но это применимо и для 1.12.2 полагаю)
Что было сделано в процессе рассинхронизации? Весь ,,числовой кеш,, (включая числовые массивы, которые могут быть переиспользованы) внутри генераторов (ChunkGeneratorOverworld, BiomeProvider, IntCache) был перенесен в ,,кеш локального потока,, (Туда же перенес рандом) (до переноса вся карта была одним огромным артефактом), и получил ,,то как на скринах,, (если не хранить ,,кеш локального потока,, вообще - то результат тот-же самый)
Но по какой-то причине, ,,независимая генерация в разных потоках,, до сих пор не такая уж и не зависимая.
Приглашаю экспертов в данной области, подсказать где что я мог упустить
UPD еще 1 скрин
В общем, я переложил генерацию чанка из основного потока в специально выделенный пул потоков, и почти успешно, за исключением вот таких артефактов
С чем данные ошибки могут быть связаны?
И теперь подробнее к деталям
Цитирую @Liahim Принцип работы генератора чанков. Начало
(Хоть гайд и соотносится к более новым версиям, но это применимо и для 1.12.2 полагаю)
(Сам лично находил внутри ChunkGeneratorOverworld.generateHeightmap() при вызовах NoiseGeneratorOctaves.generateNoiseOctaves эти магические числа, спасибо автору за проделанную работу)Многие, кто заглядывал в класс генератора, могли заметить две магические цифры: 5 и 33. В последних версиях эти цифры вынесены в настройки и от них зависит размер чанка, в версии 1.7.10 они были жёстко прописаны в коде. Меня тоже по началу сбивали с толку такие странные значения. А почему не 4 и 32, думал я, ведь это было бы логично. Размер чанка 16х16х256, делим это на 4 и 8 соответственно и получаем 4х4х32. Логично? Нет.
Дело в том, что каждый чанк генерируется независимо, и для того, чтобы наш ландшафт совпадал с ландшафтом соседних чанков, нужно указывать величину шума по его границам. То есть, значения в вершинах решётки на границе у двух смежных чанков будут одинаковыми. Отсюда и получается финальный размер решётки для одного чанка 5х5х33.
Всё это очень напоминает кристаллическую решётку, не так ли?
Что было сделано в процессе рассинхронизации? Весь ,,числовой кеш,, (включая числовые массивы, которые могут быть переиспользованы) внутри генераторов (ChunkGeneratorOverworld, BiomeProvider, IntCache) был перенесен в ,,кеш локального потока,, (Туда же перенес рандом) (до переноса вся карта была одним огромным артефактом), и получил ,,то как на скринах,, (если не хранить ,,кеш локального потока,, вообще - то результат тот-же самый)
Но по какой-то причине, ,,независимая генерация в разных потоках,, до сих пор не такая уж и не зависимая.
Приглашаю экспертов в данной области, подсказать где что я мог упустить
UPD еще 1 скрин
Последнее редактирование: