Оригинальная статья с gamasutra.com
Перевёл hitzu
Кто: программисты Антти Лето, Дамьен Морелло, ведущий дизайнер Каролиина Корппоо
Мы работаем в Colossal Order, финской независимой студии, и специализируемся на играх-симуляторах для ПК. С момента основания в 2009 и мы выпустили три игры: Cities in Motion, игра-симулятор общественного транспорта, CIties in Motion 2, её сиквел, и Cities: Skylines, олдскульный градосимулятор. В нашей команде всего 13 человек, и мы все очень любим тортики и синих пичуг.
Серия игр Cities in Motion была обращена к довольно небольшой, но очень преданной аудитории, в то время как Skylines обратила на себя взоры намного более обширной части игроков, не все из которых знакомы с симуляторами. Мы гордимся тем, что поклонникам градосимуляторов игра понравилась и рады тому, как моддеры быстро принялись улучшать игру. Нашей целью является поощрять моддинг и стереть границу между игрой и творчеством так, чтобы люди почувствовали игру своей.
Что: Транспортная система в Cities: Skylines
Регулирование транспорта – одна из главных целей в игре, возможно наиважнейшая. Есть несколько разных типов дорог, и каждый важен по-своему. Инструмент дорог достаточно гибок, чтобы игроки могли создать сложные дорожные развязки и таким образом регулировать транспортный поток, но и довольно простой, чтобы обычная прокладка дорог не превратилась в тяжкую повинность.
Существует предел того, сколько жителей и машин может быть смоделировано на улицах одновременно. Если лимит не пройден, жители могут решить попутешествовать. У горожан есть несколько мест, которые они хотят посетить. Когда эти заведения заполнятся, то спрос на новые такие заведения возрастёт. Когда житель выходит на улицу, то он выбирает самый быстрый способ добраться до места назначения.
Они принимают в расчёт имеют ли они личный автомобиль, есть ли заторы на дорогах и можно ли воспользоваться общественным транспортом. основываясь на этих факторах, они решают идти ли им пешком, поехать на автобусе или на машине. Пешеходы могут пользоваться отдельными пешеходными дорожками, но не могут ходить по магистральным дорогам.
Когда автомобили спланируют свой маршрут, то они “прилипнут” к нему. Они не будут пересчитывать его посередине дороги, ели только на их пути ничего не изменилось. Если по какой-то причине они не могут найти дорогу в выбранное место, то телепортируются в место отбытия.
Машины принадлежат жителям или зданиям, так что они всегда должны куда-либо вернуться. Некоторые приезжают из-за пределов карты и возвращаются туда, если потеряются по пути. Транспорт загодя выбирает ту полосу для движения, которая нужна для поворота в ту сторону, куда ему нужно.
Почему?
С самого начала нашей целью было создать систему с миллионом жителей. Это не жёсткое ограничение, мы прикидывали такое число горожан для полностью застроенного города и балансировали игру, руководствуясь этой цифрой. Но нам сразу было понятно, что если мы хотим сохранить приемлемые системные требования, то не все из миллиона смогут одновременно путешествовать по улицам. Это значит, что нам нужно было создать такую структуру, при которой игрок не понесёт наказание, если рабочие физически не отправляются на работу.
Мы много раз переделывали систему транспорта, и это было трудным испытанием для нас, ведь каждый игрок должен будет взаимодействовать с ней. Например во время испытаний мы пробовали делать так, чтобы автомобили чаще меняли полосы во время движения, но это привело только к сущему хаосу на дорогах, ведь машины пытались перестроиться на занятую полосу и тем самым блокировали сразу обе, перекрывая движение вовсе.
Телепортация же была внедрена как мера безопасности. Тестирование показало, что менее опытные игроки испытывали мощные проблемы, когда вся транспортная сеть превращалась в одну сплошную пробку, и даже с помощью транспортной карты невозможно было обнаружить причину, когда все дороги с ожидающими на них машинами горели красным. Это значит, что игроки не могут выявить проблемное место, если у них нет опыта или им вовсе не очень понятна эта тема с трафиком.
В качестве решения и была придумана система с телепортацией в изначальное место, если жители попадают в затруднительное положение. Проблемное место никуда не девается, а поток машин стоит или ползёт как улитка, но пробка не растёт неконтролируемо. Поэтому информационный слой работает как надо, рисуя красным этот участок, чтобы игрок обратил на него внимание.
Как
Без дорог не будет и транспорта. Поэтому давайте взглянем как они устроены. Когда игрок строит дорогу, он в действительности расставляет узлы. Два узла составляют один сегмент, а вся дорога сделана из одного или нескольких сегментов. У сегментов есть предельный размер, поэтому длинная дорога будет разбита на несколько сегментов. Одна из причин состоит в том, что дороги должны следовать ландшафту, поэтому даже прямая дорога потребует несколько сегментов чтобы не проваливаться под холм. Другая причина в том, что небольшие сегменты проще оптимизировать для расчёта столкновений, рендеринга и вообще.
Узлы (известные также как контрольные точки) содержат позиции начала и конца сегмента, а сам сегмент содержит направление начала и конца. Затем эта структура конвертируется в кривую Безье с помощью создания дополнительных контрольных точек из заданный позиций и напрвлений.
Геометрия дороги затем создаётся при помощи стандартного меша, тесселяции в совокупности с вершинным шейдером, который преобразует меш согласно данным сплайна. Это эффективно, так как данные вершин для дорог могут быть общими для дорог одного типа. UV карты также рассчитываются в вершинном шейдере на основе длины сплайна.
Перекрёстки создаются похожим образом. Их сегменты содержат данные о соединениях с соседними сегментами, а также тип дорог. Зная тип дороги, каждому сегменту теперь известно о доступных ему полосах, что и определяет их количество и смещение от центра.
Учитывая всё сказанное выше, машины и грузовики знают где им можно ездить по дороге. Вместо того, чтобы задействовать наивную интерполяцию вдоль сплайна, мы сделали весь транспорт настоящими физическими объектами со своей скоростью, которые стараются двигаться через множество точек привязки, следуя кривой. Это позволяет предсказать поведение на крутых поворотах и перекрёстках, перед которыми надо замедляться или затормозить в зависимости от обстоятельств. Максимальная скорость задаётся типом дороги по которой движется транспорт.
Когда житель хочет выбрать новое место назначения, его путь будет просчитан от его текущей позиции, принимая в расчёт ходьбу пешком, езду на машине и на общественном транспорте… который, кстати, сделан настолько круто, что жители могут менять транспорт, переходя пешком от одной автобусной остановки до другой. Во время расчёта поиска пути, создаётся счёт того, сколько сегментов/полос надо пройти, учитывая состояние пробок, скоростной предел и направление.
Трафик симулируется по правилу кто первый, тот и едет. Используя точки привязки, упоминаемые ранее, транспорт создаёт на своём пути так называемые “берегись-сегменты” – когда два разных таких сегмента пересекаются, мы знаем, что здесь будет столкновение, так что данные о скорости и дистанции до этого сегмента используются для того чтоб определить кто поедет, а кто притормозит чтобы пропустить. Светофоры – это исключение из правила. Они просто предотвращают появление точек привязки на перекрёстке, заставляя транспорт сбросить скорость и затормозить до тех пор, пока не загорится зелёный.
Конечно есть ещё другие факторы, влияющие на поведение транспорта, но в основном, всё крутится вокруг этих простых правил.
С точки зрения производительности невозможно сэмулировать всё это для каждой машины каждый кадр. Секрет хорошей производительности в том, чтобы распределить вычисления по времени насколько это возможно. В нашем случае движение автомобилей просчитывается примерно 4 раза в секунду, а рендеринг берёт из этого два кадра, чтобы получить гладкое перемещение, вращение и скорость. Более сложные решение вычисляются ещё реже, но благодаря разглаживанию это выглядит так, будто симуляция постоянно обновляется.
Результат
Некоторые игроки считают игру слишком лёгкой из-за наличия телепортации. Это действительно делает игру проще без перекрывающего дорогу самому себе транспорта, но это действительно необходимо ради умеренной кривой обучения. Если бы не было телепортации, то время реакции для того, чтобы заметить и решить проблему до тех пор, пока она не усилится лавинообразно, становится слишком маленьким. Есть мод, который убирает телепортацию из игры, так что игроки, получающие большее удовольствие от такого вызова, не будут скучать. В конце концов, количество людей, причитающих о проблемах трафика, относительно невелико, поэтому мы считаем, что выбрали правильное решение.
Несмотря на это, трафик является самой сложной частью игры для большинства игроков. Выбор полосы движения водителями заранее может выглядеть странно. Машины собираются в очередь всего на одной полосе, а все остальные пустуют и транспорт на них мчится мимо. Строго говоря, переполненная полоса говорит игроку о том, что где-то впереди находится пересечение, которое не даёт транспорту двигаться непрерывно, но глядя на длинную вереницу машин, некоторые игроки принимают это за баг.
Главная загвоздка сейчас – научить игроков как работать с транспортом, мы смотрим на обсуждения на форумах и видим, что эта тема игрокам интересна. Ухватив основы, множество игроков находит занимательным и получает множество удовольствия, оптимизируя транспортные потоки и управляя ими.