Пост

Дневник разработки: февраль

Генерация планеты

Всем привет и добро пожаловать в февральский апдейт.

Большую часть прошедшего месяца я провел в поисках ответа на вопрос: “Смогу ли я сгенерировать такую же большую планету, как Земля?”. Кроме того я хотел, чтобы она была не просто большой, но еще и выглядела как наша планета. Этого требует лор игры, но к тому же не так много игр пробуют принять этот вызов. Обычно в них используются полностью процедурно сгенерированные планеты с похожими на аналоги из нашей Солнечной системы физическими параметрами и цветовой схемой. Это немного не то, что я хотел бы видеть в своей игре.

Марс
Первая версия Марса

Чтобы достичь поставленной цели, мне нужно было решить несколько проблем. Первая из них — размер. В расчетах при таких масштабах числа с одинарной точностью начинают быстро накапливать ошибки и при радиусе планеты даже в пять раз меньшем чем у Земли на поверхности начинают появляться заметные разрывы (стоит отметить, что Кербин в 10 раз меньше Земли).

Трещины в сгенерированной поверхности
Избавление от этих трещин — на самом деле нетривиальная задача

Единственным хорошим решением было использование чисел с двойной точностью. Но тогда для генерации геометрии планеты нельзя использовать GPU, потому что видеокарты не очень любят такие числа и вычисления будут происходить гораздо медленнее. Но генерация на CPU занимала почти 20 миллисекунд. Это значит что я уже получал меньше 60 фпс при том, что помимо нее еще нужно было рассчитывать орбитальную механику, игровую логику, ввод пользователя, проигрывать звуки и все это отрисовывать.

Я занялся поиском решений, и через какое-то время нашел Jobs System и Burst Compiler. Это новый набор технологий от авторов Unity, который позволяет использовать все ядра центрального процессора в игре и хорошо оптимизирует код. Мне пришлось переписать всю систему генерации, чтобы она начала работать на этих технологиях, но результат вышел потрясающий. Вся генерация заняла меньше двух миллисекунд на моем Intel Core i5-4590 с четырьмя ядрами на борту. Судя по статистике Стима, это довольно средней процессор. Я уверен, что смогу еще улучшить этот результат вплоть до одной миллисекунды. Однако у этого есть своя цена: эти технологии находятся в активной разработке. А это значит, что на некотором оборудовании или программном обеспечении они могут работать некорректно или нестабильно. Что добавляет еще одну причину выпускать игру в Раннем доступе.

Вторая задача заключалась в создании гор, континентов и морей подобных оным на Земле. Я мог использовать карту высот с сайта NASA, однако Unity поддерживает максимальное разрешение такой карты равное 8192 x 4096. А это примерно 9 квадратных километров на один пиксель, чего явно недостаточно. Я решил использовать комбинированный подход. Для области в размером 3 x 3 километра я буду получать базовую высоту с карты NASA, а все недостающие детали поверхности буду генерировать процедурно. Единственное, с чем мне пока не удалось разобраться — это с реками. Даже самые большие реки на самом деле слишком маленькие, чтобы быть представленными на карте высот, то есть мне как-то тоже нужно будет их генерировать. Скорее всего я отложу эту проблему на период Раннего доступа.

Карта высот Земли
Карта высот Земли

Последнее, что требовалось реализовать — это текстурирование. Стандартная техника текстурирования, основанная на высоте, мне не подходила, так как на больших масштабах это смотрелось неестественно. Процедурная генерация была еще хуже, так как она могла насыпать снега в Африке или засадить Гренландию тропическими лесами. Но комбинированный подход спас меня и в этот раз. Я написал простую систему симуляция климата, генерирующую карту температур и карту влажности, которые я мог использовать для того, чтобы определить биом текущей местности и подобрать соответствующий набор текстур для него. Из-за упрощенности алгоритма он производит не то чтобы физически корректные результаты, но такие, которые отчасти выглядят правильно. В будущем этот алгоритм тоже можно будет усложнять и улучшать, добиваясь приближенных к реальности результатов.

Generated Earth's Moisture map
Первые результаты работы системы симуляции климата: карта влажности Земли. В темных областях сухо, а в светлых влажно

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

До скорой встречи в следующем обновлении.

Авторский пост защищен лицензией CC BY 4.0 .

© unbeGames. Некоторые права защищены.

Популярные теги