Как City-sim может симулировать сотни персонажей?

8

Мои игры обычно начинают довольно легко отставать, когда есть пара сотен ящиков, представляющих возможных персонажей. В то время как игры типа SimCity или даже Anno имеют сотни персонажей.

Я понял, что эти игры не обновляют все на каждом тике, потребности обрабатываются с интервалами, и это не проблема рендеринга, но все эти крошечные существа имеют индивидуальный поиск пути и т. Д.
Я просто не могу понять, как они могут тянуть это для тысяч персонажей даже на старых машинах. Как они это делают?

Этот вопрос был обновлен, чтобы отнести к огромным числам, где люди на самом деле не учитываются и просто имитируются для погружения и эстетики.

(Связано, если ссылаться на отдельные символы: как Dwarf Fortress отслеживает так много сущностей, не теряя при этом производительности? )

(Другой вопрос, но, возможно, связанный ?: Рендеринг сотен анимированных персонажей в Unity3D )

MisteriosM
источник
2
Это на самом деле не похоже на дубликат для меня. В то время как игры типа Dwarf Fortress действительно имитируют действия каждого агента в отдельности, как только мы перейдем к играм масштаба города, как описано в этом вопросе, это уже не очень практично. Вместо этого эти симы, как правило, работают на более «кусочном» уровне популяционных тенденций, заполняя детали отдельных людей, следуя этим тенденциям, только когда вы внимательно присмотритесь. Из-за этих различий в стратегиях, я думаю, что это стоит вновь открыть и ответить отдельно от связанного вопроса.
DMGregory
Я внес некоторые изменения, чтобы подчеркнуть различия. Как мне отменить связь между вопросами?
MisteriosM
Оптимизация производительности - очень широкая область. Есть миллион вещей, которые вы могли бы сделать неправильно в своей игре. Но, не глядя на вашу игру и результаты профилировщика, трудно сказать, где могут быть ваши узкие места. Теперь мы могли бы снимать в темноте и размышлять о локальности памяти, распараллеливании или продвинутых алгоритмах поиска путей для нескольких агентов, но трудно сказать, что вы уже знаете и что относится к вашей игре. Поэтому я боюсь, что этот вопрос слишком широк.
Филипп
Вы уже пробовали объединение объектов? Создание экземпляров обходится дорого, активация и деактивация уже созданных объектов - это не так много
Вы также можете использовать излучатель частиц. Поскольку они на самом деле просто визуальное представление демографических данных, они не должны быть умными или сложными.
Стефан

Ответы:

12

Как и большая часть gamedev, ответ на то, как городские сим-игры совершают этот, казалось бы, невозможный подвиг, таков: они, вероятно, этого не делают. Они просто притворяются. ;)

Подобные симы, как правило, будут работать на «кусочном» уровне, моделируя группы людей, кварталы, транспортные коридоры или другую динамику города в целом, а не обрабатывать ИИ для каждого из тысяч или миллионов жителей.

Есть несколько способов подойти к этому:

  • «Разреженный» снизу вверх: здесь мы по-прежнему моделируем отдельных жителей города, но не «слишком много» из них и не каждый кадр. Вы можете думать об этом, как опрос или перепись, проводимая случайной выборке людей каждую неделю. Вы интерполируете результаты, чтобы получить оценки более широкого виртуального населения - где они живут, их призвания, дохода, демографии и т. Д.

    Так, например, если вы симулируете в своем городе только сотню жителей, и 5 из них являются студентами, то вы можете оценить, что около 5% населения вашего города составляют студенты, и соответственно смоделировать спрос на школы.

    Возможно, вам придется время от времени повторно генерировать случайные выборки из распределения населения вашего города, чтобы избежать чрезмерной кластеризации / разреженности (например, если район становится непопулярным и все жители вашей переписи переезжают, вы хотите отметить исход, не оставляя его полностью лишен представления в вашей симе!)

  • Сверху вниз: здесь вы найдете мастер-формулу, которая смотрит на ваш город и моделирует его динамику в целом. В стиле, аналогичном макроэкономике, мы пренебрегаем деталями отдельных агентов или считаем их своего рода непрерывно делимой «жидкостью» экономической деятельности, которая течет в соответствии с принципами, основанными на принципах.

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

  • Середина: возможны различные гибриды между ними - например, имитация каждой «фракции», «отрасли» или демографического сегмента города как своего собственного метаперсона, принятие своих индивидуальных решений, но разбросанных по тепловой карте или волновая функция по всему городу, а не существующая в каком-либо одном теле. Или разделить город на части, каждый из которых обрабатывает свои собственные меньшие правила во взаимодействии со своими соседями.

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

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

Это означает, что нам обычно не нужно искать пути для каждого агента. Вместо этого мы можем выполнить один главный этап отображения потока по всей дорожной сети, чтобы определить общий объем различных видов трафика по каждому сегменту. Затем мы можем создать достаточное количество транспортных средств нужных типов в этих сегментах, чтобы отразить эту плотность. Однажды порожденные, агенты могут просто обойтись с местным управлением или предварительно сгенерированными путевыми точками, чтобы добраться до точки исчезновения. Правильно сбалансированное соотношение порогов спавна вдоль каждого сегмента и скорости нереста позволяет нам поддерживать любой постоянный объем трафика, который мы хотим.

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

Для многих игр этого будет достаточно. Игроку часто не удается выбрать отдельного агента, чтобы опросить его о том, что он там делает или куда идет, поэтому трудно определить швы и заметить, что агент делает что-то, что не имеет смысла, как ездить вокруг одного и того же блока в три раза.

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

Д.М.Григорий
источник