Как и большая часть gamedev, ответ на то, как городские сим-игры совершают этот, казалось бы, невозможный подвиг, таков: они, вероятно, этого не делают. Они просто притворяются. ;)
Подобные симы, как правило, будут работать на «кусочном» уровне, моделируя группы людей, кварталы, транспортные коридоры или другую динамику города в целом, а не обрабатывать ИИ для каждого из тысяч или миллионов жителей.
Есть несколько способов подойти к этому:
«Разреженный» снизу вверх: здесь мы по-прежнему моделируем отдельных жителей города, но не «слишком много» из них и не каждый кадр. Вы можете думать об этом, как опрос или перепись, проводимая случайной выборке людей каждую неделю. Вы интерполируете результаты, чтобы получить оценки более широкого виртуального населения - где они живут, их призвания, дохода, демографии и т. Д.
Так, например, если вы симулируете в своем городе только сотню жителей, и 5 из них являются студентами, то вы можете оценить, что около 5% населения вашего города составляют студенты, и соответственно смоделировать спрос на школы.
Возможно, вам придется время от времени повторно генерировать случайные выборки из распределения населения вашего города, чтобы избежать чрезмерной кластеризации / разреженности (например, если район становится непопулярным и все жители вашей переписи переезжают, вы хотите отметить исход, не оставляя его полностью лишен представления в вашей симе!)
Сверху вниз: здесь вы найдете мастер-формулу, которая смотрит на ваш город и моделирует его динамику в целом. В стиле, аналогичном макроэкономике, мы пренебрегаем деталями отдельных агентов или считаем их своего рода непрерывно делимой «жидкостью» экономической деятельности, которая течет в соответствии с принципами, основанными на принципах.
Вместо того, чтобы думать об индивидуальных предпочтениях и вариативности людей, ваши правила игры могут больше походить на дифференциальные уравнения, касающиеся близости удобств, ставок налогов и производительности, а также ценностей собственности и уровней преступности, а также и ...
Середина: возможны различные гибриды между ними - например, имитация каждой «фракции», «отрасли» или демографического сегмента города как своего собственного метаперсона, принятие своих индивидуальных решений, но разбросанных по тепловой карте или волновая функция по всему городу, а не существующая в каком-либо одном теле. Или разделить город на части, каждый из которых обрабатывает свои собственные меньшие правила во взаимодействии со своими соседями.
Теперь, когда игрок приближается достаточно близко, чтобы увидеть отдельных людей, или просматривает статистические отчеты с указанием количества людей - это не обязательно основная истина, которая используется для запуска сима. Скорее они могут быть предполагаемым продуктом этого.
Допустим, мы увеличиваем конкретный городской квартал. По нашему общегородскому симу мы знаем грубое население этой части города, виды деятельности, которые там происходят, время суток, когда он активен. Таким образом, по требованию мы можем породить соответствующее количество людей соответствующей демографии, выполняющих такие виды деятельности. Их ИИ может быть очень простым, может быть, таким, как проигрывание анимации на месте или следование путевой точке до ближайшего края двери / экрана, где они могут исчезнуть.
Это означает, что нам обычно не нужно искать пути для каждого агента. Вместо этого мы можем выполнить один главный этап отображения потока по всей дорожной сети, чтобы определить общий объем различных видов трафика по каждому сегменту. Затем мы можем создать достаточное количество транспортных средств нужных типов в этих сегментах, чтобы отразить эту плотность. Однажды порожденные, агенты могут просто обойтись с местным управлением или предварительно сгенерированными путевыми точками, чтобы добраться до точки исчезновения. Правильно сбалансированное соотношение порогов спавна вдоль каждого сегмента и скорости нереста позволяет нам поддерживать любой постоянный объем трафика, который мы хотим.
Таким образом, люди и транспортные средства, которые видит игрок, - это выдумки, похожие на форсированную систему частиц, создающую впечатление реалистичных облаков без фактического расчета полной динамики жидкости для каждой молекулы пара. ;) Мы расставляем их как декорации, чтобы сообщать о состоянии симуляции, а не управлять ею.
Для многих игр этого будет достаточно. Игроку часто не удается выбрать отдельного агента, чтобы опросить его о том, что он там делает или куда идет, поэтому трудно определить швы и заметить, что агент делает что-то, что не имеет смысла, как ездить вокруг одного и того же блока в три раза.
Но если вам нужны абсолютно непротиворечивые агенты в густонаселенном окружении, вы можете обратиться к аккуратной технике под названием « Поколение Алиби ». Это сложный метод выборки, который позволяет генерировать агентов, которых вы ожидаете найти в данной ситуации. Затем, если игрок пытается исследовать один из них более подробно, вы можете задним числом получить более подробную информацию о том, что они делают, таким образом, что это соответствует тому, что игрок наблюдал о них до сих пор. Идея заключается в том, что большую часть времени вы по-прежнему получаете легкие преимущества от «картонных помощников», но на месте они могут составить правдоподобное алиби, которое можно передать как полностью имитируемого агента.