@Drottarutarnum
Web, Embedded and C#

Как сделать генерацию 2D мира на лету?

В общем от безделья захотелось написать простую копалку типо терарии

Сейчас мой мир плоский, а пещеры я генерирую клеточным автоматом, пришлось его немного улучшить чтобы он соединял закрытые полости в единую пещеру

Но тут встал в опрос о котором я даже не подумал. Когда я изменил размер мира с тестовых 500х500 блоков на 10000х50000 генерация стала занимать.. нуу.. я не знаю сколько, через пол часа я остановил приложение

Сразу подумалось о том, чтобы генерировать мир в определенном радиусе от игрока, но дело в том, что если клеточный автомат запустить заново для генерации новой порции мира то будет некрасивая сшивка двух локаций

Какие есть алгоритмы для решения? Возможно клеточный автомат можно научить так делать? По запросу "caves generation" я находил все тот же клеточный автомат который вообще не годится для больших миров
  • Вопрос задан
  • 245 просмотров
Пригласить эксперта
Ответы на вопрос 3
dollar
@dollar
На чёткий вопрос - чёткий ответ.
Сначала генерировать некий "скелет", то есть каркас, структуру мира, на которую уже будет насаживаться всё остальное (по другим законам). Например, холм можно обозначить точкой в его условном центре, но не генерировать сразу. И по мере продвижения игрока к этой точке, можно уже сформировать его более детально, со всеми неровностями и мелкими незначительными особенностями.

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

И ещё при генерации на лету сложно делать поэтапную генерацию. Например, сначала рельеф, потом заполнение водой. После второго этапа, как бы вода ни была расположена, третьим этапом её можно слить (приземлить в углубления). Но как это всё делать на лету? Очень сложно. Так что для красивого продуманного мира лучше подойдёт именно предварительная генерация, либо же в случае первого варианта нужно будет продумывать очень много деталей и то, как они будут связаны друг с другом.

В первом варианте алгоритм напоминает: "Что бы могло быть в этой точке, чтобы выглядело логично и согласованно?" (при том, что игрок уже мог "наследить" в мире). А во втором варианте - это некий план, и каждый тайл - часть этого плана, то есть он связан с соседними, и создаётся на определённом этапе.
Ответ написан
@mayton2019
Ent. Software engineer. Oracle. SQL. BigData.
Первая мысль - профилирование кода. Что там медленно работает. Возможно это 1 цикл. Ну тоесть без этой информации мы не доисследовали проблему до конца. А это - непрофессионально. Надо изучить.

Второе - это "разделяй и властвуй". Карту надо резать на tiles. И рендерить только необходимое на данный момент.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы